异常三种处理方案
实际项目中为了让用户有更好的体验,代码出现异常一般不会直接显示给用户,而是自己进行处理后返回,一般有三种处理方案,全局异常处理、特定异常处理和自定义异常处理,下面开始会一一介绍
全局异常处理
@ControllerAdvice
public class GlobalExceptionHandler {
// 全局异常
@ExceptionHandler(Exception.class)
@ResponseBody
public R error(Exception e){
e.printStackTrace();
return R.error().message("执行了自定义异常");
}
}
特定异常处理
@ControllerAdvice
public class GlobalExceptionHandler {
// 特定异常
@ExceptionHandler(ArithmeticException.class)
@ResponseBody
public R error(ArithmeticException e){
e.printStackTrace();
return R.error().message("除数不能为零");
}
}
自定义异常处理(推荐)
1.首先自定义异常:
@Data
@AllArgsConstructor //生成有参数构造方法
@NoArgsConstructor //生成无参数构造
public class MyException extends RuntimeException {
private Integer code;//状态码
private String msg;//异常信息
}
2.编写异常处理器
@ControllerAdvice
public class GlobalExceptionHandler {
// 自定义异常处理
@ExceptionHandler(MyException.class)
@ResponseBody
public R error(MyException e){
return R.error().code(e.getCode()).message(e.getMsg());
}
}
3.在可能出现异常处抛出自定义异常
贴出开发中常使用的异常统一处理类
//@ControllerAdvice
// @ResponseBody
@RestControllerAdvice // @ControllerAdvice+@ResponseBody
public class GlobalExceptionHandler {
private Logger logger = LoggerFactory.getLogger(getClass());
// 特定异常
@ExceptionHandler(ArithmeticException.class)
public R error(ArithmeticException e){
logger.error(e.getMessage(),e);
return R.error().message("除数不能为零");
}
@ExceptionHandler(NoHandlerFoundException.class)
public R handlerNoFoundException(Exception e) {
logger.error(e.getMessage(),e);
return R.error().code(404).message("路径不存在,请检查路径是否正确");
}
@ExceptionHandler(DuplicateKeyException.class)
public R handleDuplicateKeyException(DuplicateKeyException e){
logger.error(e.getMessage(), e);
return R.error().message("数据库中已存在该记录");
}
@ExceptionHandler(AuthorizationException.class)
public R handleAuthorizationException(AuthorizationException e){
logger.error(e.getMessage(), e);
return R.error().message("没有权限,请联系管理员授权");
}
@ExceptionHandler(NullPointerException.class)
public R handleAuthorizationException(NullPointerException e){
logger.error(e.getMessage(), e);
return R.error().message("空指针异常");
}
// 自定义异常处理
@ExceptionHandler(MyException.class)
public R error(MyException e){
logger.error(e.getMessage());
return R.error().code(e.getCode()).message(e.getMsg());
}
// 全局异常
@ExceptionHandler(Exception.class)
public R error(Exception e){
logger.error(e.getMessage(),e);
return R.error().message("出现异常");
}
}
文章中提到的关于R为统一返回数据格式,请参考https://blog.csdn.net/qq_45533609/article/details/107299812