一、什么是统一异常处理
我们想让异常结果也显示为统一的返回结果对象,并且统一处理系统的异常信息,那么需要统一异常处理
统一异常处理需要两个注解进行搭配
@ControllerAdvice
@ExceptionHandler
@ControllerAdvice有三大作用:
全局异常处理
全局数据绑定
全局数据预处理
@ExceptionHandler注解可以用来统一处理方法抛出的
二、全局异常处理
首先需要在类上加上注解@ControllerAdvice
然后编写全局异常处理的方法
例如:
/**
* 全局异常处理
* @param e
* @return
*/
@ExceptionHandler(Exception.class)//在出现什么异常的时候执行该方法
@ResponseBody //可以返回数据
public R error(Exception e){
e.printStackTrace();
return R.error().message("执行了全局异常处理...");
}
@ExceptionHandler注解中可以规定当出现异常时就执行该方法
其中 R 是返回统一的数据类型,参考另一篇文章统一返回数据格式
三、特定异常处理
首先添加异常处理的方法
/**
* 特定异常处理:出错时,会先查看特定异常,如果没有特定异常,就会执行全局异常处理
* @param e
* @return
*/
@ExceptionHandler(ArithmeticException.class)//在出现什么异常的时候执行该方法
@ResponseBody //可以返回数据
public R error(ArithmeticException e){
e.printStackTrace();
return R.error().message("执行了特定异常处理...");
}
当出现ArithmeticException异常时,就会执行该方法
四、自定义异常
1、创建自定义异常类
@Data
@AllArgsConstructor //所有的有参构造
@NoArgsConstructor //无参构造
public class GuliException extends RuntimeException{
private Integer code; //异常编码
private String msg;//异常信息
}
其中注解上边的三个注解用到插件lombok,参考文章lombok插件使用
GuliException就是自定义异常的类,名字可以随意取
2、业务中需要的位置抛出GuliException
eg:
try {
int a = 10/0;
}catch(Exception e) {
throw new GuliException(20001,"出现自定义异常");
}
3、添加异常处理方法
/**
* 自定义异常
* @param e
* @return
*/
@ExceptionHandler(GuliException.class)
@ResponseBody //可以返回数据
public R error(GuliException e){
log.error(e.getMessage()); //将日志信息打印进文件中
e.printStackTrace();
return R.error().code(e.getCode()).message(e.getMsg());
}
这样就完成的指定的异常处理