异常 | 求你别再写满屏的try-catch了,用全局异常好吗?- 夹私货-行测
Hi,我是小小,今天又见面了,小小最近需要备考清远市的考试,恩恩,是的,2020年广东省事业单位公开招聘高校应届毕业生的考试,于11日考试,小小将会准时到清远考试。备考啦
先说说备考的事情
当然啦,备考是很晚的时候才开始的,书买晚了,没办法,今天晚上刚刚才想起来才有这一出的,先从网上找点真题看看吧。
介绍什么是行测
行测,全称,行政职业能力测试,暨大杂烩式选择题。
所谓大杂烩,指的是行测这门要在2个小时之内做完包括常识,言语理解,数量关系,判断推理和资料分析五个部分共130+题目。任何一个部分的不足和缺陷都会让你的行测分数止步70分。
而行测的70分,是能决定你的整体成绩是否在130分以上的关键。
一般来讲,如果不是特别擅长总结和书写文章,申论这门的成绩会在60分左右徘徊,即便你文采飞扬,才华横溢,申论的主观人工判卷模式也会导致,每年申论高分也就在70+。但行测不同,全是客观题,对就是对,错就是错。
正所谓,只要行测答的好,年年高分跑不了。
讲行测题型之前,先告诉大家行测题目的计分方法。
分数=正确题目数量X0.8
国家公务员行测分数是国家公务员局根据每个题目难度设置的系数乘以分数形成的,没有什么准确的几点几划分,但是约等于总题目正确数乘0.8,这肯定没跑,上下浮动基本在2分以内。
题目难度
数量关系>常识>逻辑推理>言语理解>资料分析
题目时间和顺序
8:55发卷下来就看常识,开考就写常识,大概5分钟搞定
写数学题,先浏览,看见熟悉的题目先做(因为我数学学得比较好,数学差的朋友,请不要效仿)20分钟之内搞定,不管会不会都不做了。
写资料分析,30分钟四道大题,按照四-三-一-二的顺序做。
5分钟涂卡,检查是不是有涂错的,不再做题。
10点了。
开始做逻辑推理,按照类比-定义-逻辑-图形顺序来做,35分钟搞定。
言语理解,正常做就行,20分钟。有些人问我,为毛要最后做言语理解,言语理解不是很不容易选择吗?嗯,言语部分模棱两可的答案太多,但是凡是能看懂中国字,就算懵也能懵个答案吧。而且,跟着你花了很长时间,一定能做对似的。
涂卡,检查。
刷题
直接刷题相当干脆
第一题
1、当中原的青铜文化如火如荼之时,面对铜料欠缺的窘境,务实的越人___________,开创了瓷器生产的新纪元。秦汉时期是中国历史上大动荡大变革的时代,各行各业的面貌都___________,古老越地的陶瓷业也是如此。进入东汉,过去的原始瓷___________退出历史的舞台,一种面貌全新的青瓷在上虞曹娥江中游地区的窑场随之诞生。
依次填入画横线部分最恰当的一项是:
A.另辟蹊径 焕然一新 悄然
B.独具慧眼 蒸蒸日上 突然
C.天马行空 日新月异 黯然
D.因地制宜 朝气蓬勃 淡然 答案 A
第二题
中国的县城确实太复杂,塞北尚在千里冰封,万里雪飘,江南已经百花吐艳,草木争辉了。2000多个县星罗棋布,地理位置、资源禀赋、文化传统和老百姓的生活方式都___________。
A.各有千秋 B.千姿百态 C.气象万千 D.千变万化 答案 A
第三题
1、甜菜的上部叶片垂直生长,叶簇呈漏斗形,这种生长方式所形成的叶面空间的配制结构,极有力于光照的吸收,提高植株和群体的光合效率。而车前草的叶片是轮生的,叶片夹角为137.5度,这正是圆的黄金分割的弦角,叶片按照这个角度生长,可以充分利用光照。梨树随着树干长高,叶片沿对数螺旋上升,每个叶片都不会遮蔽下面的叶片。
这段文字意在说明:
A.光照吸收率是影响植物生长的关键因素
B.暗合数学规律的叶片结构对植物生长有利
C.不同的生长环境造成了植物叶片生长的差异
D.对光照的吸收影响叶片的生长角度 答案 B
第四题
2、金鱼实际上是一类人工驯养的鲫鱼。大约2000年以前,中国的古人就开始养殖银鲫。作为食物和观赏鱼。随着时间的推移,基因突变和人工选择使银鲫身上出现了橙、红、黄等颜色,改变了其沉闷乏味的形象,也造就了我们今天看到的多姿多彩的金鱼。17世纪的时候,金鱼传到欧洲,并于19世纪50年代传到美国。
这段话主要介绍了:
A.金鱼的演进
B.金鱼的特点
C.金鱼的用途
D.金鱼的养殖 答案 A
第五题
在下列4*4的正方形矩阵中,每个小方格可填入一个汉字。要求每行每列以及粗线框成的4个小正方形中均含有甲、乙、丙、丁4个汉字。
A.甲 B.乙 C.丙 D.丁 答案 C
第六题
1、2013年二季度,我国税收月收入同比增速逐步提高,分别为7.9%、8.3%和12.9%。截至2013年6月,全国税收总收入完成59260.61亿元,同比增长7.9%,较上年同期回落1.9个百分点。
问题:2013年第一季度我国税收总收入同比增速低于7.9%。(判断正误) 答案 正确
好啦,今日的题目到此为止,开始今日的文章,全局异常处理
通过maven下载相关依赖
<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><java.version>1.8</java.version><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.17.RELEASE</version><relativePath /></parent><dependencies><!-- Spring Boot Web 依赖 核心 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Boot Test 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.41</version></dependency></dependencies>
代码编写
Spring Boot 项目已经有了一些异常处理,需要对异常处理进行捕获并进行处理。Spring Boot 中有一个 ControllerAdvice的注解,使用该注解表示开启全局异常,只需要自定义方法使用ExceptionHandler注解然后定义捕获异常类型即可进行统一的捕获和处理。例子
@ControllerAdvice
public class MyExceptionHandler {@ExceptionHandler(value =Exception.class)public String exceptionHandler(Exception e){System.out.println("未知异常!原因是:"+e);return e.getMessage();}
}
自定义基础接口类
自定义一个基础接口类,自定义的错误描述类需要实现这个接口
public interface BaseErrorInfoInterface {/** 错误码*/String getResultCode();/** 错误描述*/String getResultMsg();
}
自定义枚举类
自定义一个枚举类,并实现这个接口
public enum CommonEnum implements BaseErrorInfoInterface {// 数据操作错误定义SUCCESS("200", "成功!"),BODY_NOT_MATCH("400","请求的数据格式不符!"),SIGNATURE_NOT_MATCH("401","请求的数字签名不匹配!"),NOT_FOUND("404", "未找到该资源!"),INTERNAL_SERVER_ERROR("500", "服务器内部错误!"),SERVER_BUSY("503","服务器正忙,请稍后再试!");/** 错误码 */private String resultCode;/** 错误描述 */private String resultMsg;CommonEnum(String resultCode, String resultMsg) {this.resultCode = resultCode;this.resultMsg = resultMsg;}@Overridepublic String getResultCode() {return resultCode;}@Overridepublic String getResultMsg() {return resultMsg;}}
自定义异常类
自定义异常类,用于处理发生的业务异常
public class BizException extends RuntimeException {private static final long serialVersionUID = 1L;/*** 错误码*/protected String errorCode;/*** 错误信息*/protected String errorMsg;public BizException() {super();}public BizException(BaseErrorInfoInterface errorInfoInterface) {super(errorInfoInterface.getResultCode());this.errorCode = errorInfoInterface.getResultCode();this.errorMsg = errorInfoInterface.getResultMsg();}public BizException(BaseErrorInfoInterface errorInfoInterface, Throwable cause) {super(errorInfoInterface.getResultCode(), cause);this.errorCode = errorInfoInterface.getResultCode();this.errorMsg = errorInfoInterface.getResultMsg();}public BizException(String errorMsg) {super(errorMsg);this.errorMsg = errorMsg;}public BizException(String errorCode, String errorMsg) {super(errorCode);this.errorCode = errorCode;this.errorMsg = errorMsg;}public BizException(String errorCode, String errorMsg, Throwable cause) {super(errorCode, cause);this.errorCode = errorCode;this.errorMsg = errorMsg;}public String getErrorCode() {return errorCode;}public void setErrorCode(String errorCode) {this.errorCode = errorCode;}public String getErrorMsg() {return errorMsg;}public void setErrorMsg(String errorMsg) {this.errorMsg = errorMsg;}public String getMessage() {return errorMsg;}@Overridepublic Throwable fillInStackTrace() {return this;}}
自定义数据格式
自定义一下数据的传输格式
public class ResultBody {/*** 响应代码*/private String code;/*** 响应消息*/private String message;/*** 响应结果*/private Object result;public ResultBody() {}public ResultBody(BaseErrorInfoInterface errorInfo) {this.code = errorInfo.getResultCode();this.message = errorInfo.getResultMsg();}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Object getResult() {return result;}public void setResult(Object result) {this.result = result;}/*** 成功** @return*/public static ResultBody success() {return success(null);}/*** 成功* @param data* @return*/public static ResultBody success(Object data) {ResultBody rb = new ResultBody();rb.setCode(CommonEnum.SUCCESS.getResultCode());rb.setMessage(CommonEnum.SUCCESS.getResultMsg());rb.setResult(data);return rb;}/*** 失败*/public static ResultBody error(BaseErrorInfoInterface errorInfo) {ResultBody rb = new ResultBody();rb.setCode(errorInfo.getResultCode());rb.setMessage(errorInfo.getResultMsg());rb.setResult(null);return rb;}/*** 失败*/public static ResultBody error(String code, String message) {ResultBody rb = new ResultBody();rb.setCode(code);rb.setMessage(message);rb.setResult(null);return rb;}/*** 失败*/public static ResultBody error( String message) {ResultBody rb = new ResultBody();rb.setCode("-1");rb.setMessage(message);rb.setResult(null);return rb;}@Overridepublic String toString() {return JSONObject.toJSONString(this);}}
自定义全局异常处理类
最后书写一个自定义的全局异常处理
@ControllerAdvice
public class GlobalExceptionHandler {private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);/*** 处理自定义的业务异常* @param req* @param e* @return*/@ExceptionHandler(value = BizException.class)@ResponseBodypublic ResultBody bizExceptionHandler(HttpServletRequest req, BizException e){logger.error("发生业务异常!原因是:{}",e.getErrorMsg());return ResultBody.error(e.getErrorCode(),e.getErrorMsg());}/*** 处理空指针的异常* @param req* @param e* @return*/@ExceptionHandler(value =NullPointerException.class)@ResponseBodypublic ResultBody exceptionHandler(HttpServletRequest req, NullPointerException e){logger.error("发生空指针异常!原因是:",e);return ResultBody.error(CommonEnum.BODY_NOT_MATCH);}/*** 处理其他异常* @param req* @param e* @return*/@ExceptionHandler(value =Exception.class)@ResponseBodypublic ResultBody exceptionHandler(HttpServletRequest req, Exception e){logger.error("未知异常!原因是:",e);return ResultBody.error(CommonEnum.INTERNAL_SERVER_ERROR);}
}
测试
用户实体类
public class User implements Serializable{private static final long serialVersionUID = 1L;/** 编号 */private int id;/** 姓名 */private String name;/** 年龄 */private int age;public User(){}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String toString() {return JSONObject.toJSONString(this);}
}
控制层
@RestController
@RequestMapping(value = "/api")
public class UserRestController {@PostMapping("/user")public boolean insert(@RequestBody User user) {System.out.println("开始新增...");//如果姓名为空就手动抛出一个自定义的异常!if(user.getName()==null){throw new BizException("-1","用户姓名不能为空!");}return true;}@PutMapping("/user")public boolean update(@RequestBody User user) {System.out.println("开始更新...");//这里故意造成一个空指针的异常,并且不进行处理String str=null;str.equals("111");return true;}@DeleteMapping("/user")public boolean delete(@RequestBody User user) {System.out.println("开始删除...");//这里故意造成一个异常,并且不进行处理Integer.parseInt("abc123");return true;}@GetMapping("/user")public List<User> findByUser(User user) {System.out.println("开始查询...");List<User> userList =new ArrayList<>();User user2=new User();user2.setId(1L);user2.setName("xuwujing");user2.setAge(18);userList.add(user2);return userList;}}
App入口
@SpringBootApplication
public class App
{public static void main( String[] args ){SpringApplication.run(App.class, args);System.out.println("程序正在运行...");}
}
执行测试
输入get命令
GET http://localhost:8181/api/user
返回参数
{"id":1,"name":"xuwujing","age":18}
使用post 方式
POST http://localhost:8181/api/user
body 参数
{"id":1,"age":18}
返回参数
{"code":"-1","message":"用户姓名不能为空!","result":null}
使用put请求
PUT http://localhost:8181/api/user
参数
{"id":1,"age":18}
返回结果
{"code":"400","message":"请求的数据格式不符!","result":null}
delete 请求
DELETE http://localhost:8181/api/user
参数
{"id":1}
返回结果
{"code":"500","message":"服务器内部错误!","result":null}
小明菜市场
推荐阅读
● 探讨 | 深入探讨Redis管道
● 必备收藏 | 超详细揭秘 Redis 持久化,建议收藏!
● 打卡学习 | Redis原理应用-线程IO模型
● 应用 | 同学,该学MyCat实际应用案例与MyCat读写分离了
● 应用 | 同学,该学MyCat实际应用案例与MyCat读写分离了
给我个好看再走好吗?
异常 | 求你别再写满屏的try-catch了,用全局异常好吗?- 夹私货-行测相关推荐
- 求求你们了,别再写满屏的 try catch 了!!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:巨人大哥 来源:cnblogs.com/jurendage/ ...
- for里面嵌套if_求求你们了,别再写满屏的 if/ else 了!
为什么我们写的代码都是 if-else? 程序员想必都经历过这样的场景:刚开始自己写的代码很简洁,逻辑清晰,函数精简,没有一个 if-else,可随着代码逻辑不断完善和业务的瞬息万变:比如需要对入参进 ...
- 别再写满屏的try-catch了,真丑,全局异常处理不会吗?
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:巨人大哥 www.cnblogs.com/juren ...
- controller层要写什么_别再写满屏的try-catch了,真丑,全局异常处理不会吗?
本文讲得比较细,所以篇幅较长.请认真读完,希望读完后能对统一异常处理有一个清晰的认识. 背景 软件开发过程中,不可避免的是需要处理各种异常,就我自己来说,至少有一半以上的时间都是在处理各种异常情况,所 ...
- 脑壳疼?别再写满屏的 if-else 了,看我怎么消灭它!
点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜留言必回,有问必答! 每天 08:15 更新文章,每天进步一点点... ...
- 【译】求你不要再写没用的提交信息了
开始尝试优化你的 Git 提交信息吧 我们都看到过的 你在一个项目中使用 Git 作为版本控制. 当你做完了一次修改之后,你想要尽快更新你的分支. 所以你打开了终端,输入了下面这些命令,完成了一次远端 ...
- 别在再满屏的 if、else 了,试试策略模式,真香!!
你还在写满屏的 if/ else/ switch 之类的判断逻辑吗? 栈长在开发人员的代码中看过太多这样的低级代码了,真的太 low,极不好维护,本文栈长就教你如何用策略模式干掉 if/ else/ ...
- 满屏的try-catch,你不瘆得慌?
目录 前言 Spring Boot 版本 全局统一异常处理的前世今生 Spring Boot的异常如何分类? 如何统一异常处理? 异常匹配的顺序是什么? 总结 前言 软件开发过程中难免遇到各种的BUG ...
- Spring Boot2.x-11 使用@ControllerAdvice和@ExceptionHandler实现自定义全局异常
文章目录 概述 未使用全局异常且未显式捕获异常的情况 使用全局异常 Step1. 自定义异常类 Step2. 封装异常信息模板 Step3. 全局异常处理类 Step4. 使用全局异常 小结 概述 我 ...
最新文章
- 弹道仿真软件_【决战决胜14】看,七部仿真试验室如何降本增效?
- 035-pgrep命令
- 少儿编程python线上课程-北京Python程序开发课程
- 这些大佬,真的牛逼了!
- [Python爬虫] 之十二:Selenium +phantomjs抓取中的url编码问题
- 使用Hyperopt实现机器学习自动调参
- plc梯形图语言c1,plc梯形图编程语言是什么?
- javafx打包路径问题_关于JavaFX的最常见问题
- Windows7 + Nginx + Memcached + Tomcat 集群 session 共享
- php评论获取时间,WordPress函数comment_date获取评论发布时间
- 飞秋2010下载在未来讲差异化
- xcode 工程没有模拟器_Xcode只允许我运行iOS设备(没有模拟器)
- 5、Oracle备份(oracle备份脚本配置)
- Oracle中的左连接与右连接
- 【codeforces】Codeforces Round #277 (Div. 2) 解读
- HD-Map lanelet2(2)
- 【微积分的本质|笔记】指数函数求导
- 墙外干货:如何通过风格指南驱动模块化交互设计
- Android Settings 应用二 获取应用消耗的流量
- Searchable Encryption for Healthcare Clouds:A Survey 翻译