欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

异常 | 求你别再写满屏的try-catch了,用全局异常好吗?- 夹私货-行测

程序员文章站 2022-04-27 07:54:34
...

异常 | 求你别再写满屏的try-catch了,用全局异常好吗?- 夹私货-行测

Hi,我是小小,今天又见面了,小小最近需要备考清远市的考试,恩恩,是的,2020年广东省事业单位公开招聘高校应届毕业生的考试,于11日考试,小小将会准时到清远考试。备考啦

先说说备考的事情

当然啦,备考是很晚的时候才开始的,书买晚了,没办法,今天晚上刚刚才想起来才有这一出的,先从网上找点真题看看吧。

介绍什么是行测

行测,全称,行政职业能力测试,暨大杂烩式选择题。

所谓大杂烩,指的是行测这门要在2个小时之内做完包括常识,言语理解,数量关系,判断推理和资料分析五个部分共130+题目。任何一个部分的不足和缺陷都会让你的行测分数止步70分。

而行测的70分,是能决定你的整体成绩是否在130分以上的关键。

一般来讲,如果不是特别擅长总结和书写文章,申论这门的成绩会在60分左右徘徊,即便你文采飞扬,才华横溢,申论的主观人工判卷模式也会导致,每年申论高分也就在70+。但行测不同,全是客观题,对就是对,错就是错。

正所谓,只要行测答的好,年年高分跑不了。

讲行测题型之前,先告诉大家行测题目的计分方法。

分数=正确题目数量X0.8

国家公务员行测分数是国家公务员局根据每个题目难度设置的系数乘以分数形成的,没有什么准确的几点几划分,但是约等于总题目正确数乘0.8,这肯定没跑,上下浮动基本在2分以内。

题目难度

数量关系>常识>逻辑推理>言语理解>资料分析

题目时间和顺序

  1. 8:55发卷下来就看常识,开考就写常识,大概5分钟搞定

  2. 写数学题,先浏览,看见熟悉的题目先做(因为我数学学得比较好,数学差的朋友,请不要效仿)20分钟之内搞定,不管会不会都不做了。

  3. 写资料分析,30分钟四道大题,按照四-三-一-二的顺序做。

  4. 5分钟涂卡,检查是不是有涂错的,不再做题。

  5. 10点了。

  6. 开始做逻辑推理,按照类比-定义-逻辑-图形顺序来做,35分钟搞定。

  7. 言语理解,正常做就行,20分钟。有些人问我,为毛要最后做言语理解,言语理解不是很不容易选择吗?嗯,言语部分模棱两可的答案太多,但是凡是能看懂中国字,就算懵也能懵个答案吧。而且,跟着你花了很长时间,一定能做对似的。

  8. 涂卡,检查。

刷题

直接刷题相当干脆

第一题

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个汉字。异常 | 求你别再写满屏的try-catch了,用全局异常好吗?- 夹私货-行测

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;
	}

	@Override
	public String getResultCode() {
		return resultCode;
	}

	@Override
	public 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;
	}

	@Override
	public 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;
	}

	@Override
	public 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)
    @ResponseBody
	public  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)
	@ResponseBody
	public 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)
	@ResponseBody
	public 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}
异常 | 求你别再写满屏的try-catch了,用全局异常好吗?- 夹私货-行测

使用post 方式

POST http://localhost:8181/api/user

body 参数

{"id":1,"age":18}

返回参数

{"code":"-1","message":"用户姓名不能为空!","result":null}
异常 | 求你别再写满屏的try-catch了,用全局异常好吗?- 夹私货-行测

使用put请求

PUT http://localhost:8181/api/user

参数

{"id":1,"age":18}

返回结果

{"code":"400","message":"请求的数据格式不符!","result":null}
异常 | 求你别再写满屏的try-catch了,用全局异常好吗?- 夹私货-行测

delete 请求

DELETE http://localhost:8181/api/user

参数

{"id":1}

返回结果

{"code":"500","message":"服务器内部错误!","result":null}
异常 | 求你别再写满屏的try-catch了,用全局异常好吗?- 夹私货-行测

异常 | 求你别再写满屏的try-catch了,用全局异常好吗?- 夹私货-行测

小明菜市场

推荐阅读

● 探讨 | 深入探讨Redis管道

● 必备收藏 | 超详细揭秘 Redis 持久化,建议收藏!

● 打卡学习 | Redis原理应用-线程IO模型

● 应用 | 同学,该学MyCat实际应用案例与MyCat读写分离了

● 应用 | 同学,该学MyCat实际应用案例与MyCat读写分离了

给我个好看再走好吗?