前言
之前读大学的时候,在学校写项目比较喜欢用到try-catch去捕获异常,面试的时候面试官问我是怎么处理异常的,我还是比较直白的说出只是简单采用try-catch去实现。 但是之后有时候写Controller层的时候如果一个个抛会比较麻烦,现在在学习到异常处理的,为了让代码更容易维护,我创建一个类集中处理异常,上网查了下发现可以用 @RestControllerAdvice + @ExceptionHandler 两个注解去实现简单的全局异常捕获。
一、首先还是先来点理论性的东西
@RestControllerAdvice是用于全局代码异常捕获,异常集中处理,更好的使业务逻辑与异常处理剥离开,与ControllerAdvice区别在于返回的数据是JSON字符串,同时跟RestController不太一样。
@ExceptionHandler是统一处理某一类异常,从而能够减少代码重复率和复杂度,value值表示要捕捉的异常,可以写多个,然后根据异常,就可以在这个方法里面进行处理。
1. 这是整个异常类处理的代码,里面返回的Result实体是我自己定义的实体类
StatusCode.ERROR 也是自己定义的一个字符串,其实就是状态码,可自行定义。
BaseExceptionHandler.java
/**
* 统一异常处理
* Created by yhj on 2019/1/24.
*/
@RestControllerAdvice
public class BaseExceptionHandler {
/**
* 全局异常捕获处理
* @param e
* @return
*/
@ExceptionHandler(value = Exception.class)
public Result error(Exception e){
e.printStackTrace();
return new Result(false, StatusCode.ERROR, e.getMessage());
}
}
2. 这里是Result实体类的代码,Result.java
package entity;
/**
* Created by yhj on 2019/1/24.
*/
public class Result {
private boolean flag;
private Integer code;
private String message;
private Object data;
public Result() {
}
public Result(boolean flag, Integer code, String message) {
this.flag = flag;
this.code = code;
this.message = message;
}
public Result(boolean flag, Integer code, String message, Object data) {
this.flag = flag;
this.code = code;
this.message = message;
this.data = data;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
3. 写到这里,其实这个简单的demo就完成了,经过测试也没有问题,返回的也是自己所写的实体JSON出错信息。