一、为什么要使用统一异常处理?
集中处理异常:通过统一异常处理,可以将所有的异常情况集中处理,避免在每个接口或方法中都编写繁琐的异常处理代码。这样可以提高代码的可维护性和可读性。
统一返回格式:通过统一异常处理,可以定义统一的返回格式,使得客户端能够更方便地理解和处理异常情况。可以将异常信息按照指定的格式进行封装,比如JSON格式,包含错误码、错误信息等,便于前端或其他服务进行处理。
异常信息层级化:通过统一异常处理,可以将不同类型的异常进行层级划分,定义不同的异常类,并针对不同的异常类型进行相应的处理。例如,可以定义业务异常、参数异常、系统异常等不同的异常类,然后在异常处理器中针对不同的异常类型进行分类处理。
统一日志记录:通过统一异常处理,可以在异常处理器中记录日志,对异常情况进行统一的日志记录,便于后期的分析和问题定位。
异常信息友好化:通过统一异常处理,可以将系统内部的异常信息转换成用户友好的提示信息,避免将敏感的错误信息暴露给客户端。这样可以增强系统的安全性和用户体验。
总之,使用统一异常处理可以提高代码的可维护性和可读性,减少重复代码,统一异常返回格式,层级化处理异常,便于日志记录和问题定位,同时改善系统的安全性和用户体验。
二、简单编写步骤,
关键就是在 注解@ControllerAdvice(basePackages = "com.qiu07.xlmall.product.controller")
basePackages是要捕获异常的包,只要包里面的某个类出现了异常都会被这个异常处理类捕获到
1、创建一包在里面创建一个定义类和一个异常处理类
2、自己定义错误码和错误信息
//创建错误码和错误信息定义类
public enum BizCodeEnume {
UNKNOW_EXCEPTION(10000,"系统未知异常");
private int code;
private String msg;
//构造方法
BizCodeEnume(int code, String msg) {
this.code = code;
this.msg = msg;
}
//获取code方法
public int getCode(){
return code;
}
//获取msg方法
public String getMsg(){
return msg;
}
}
3、在异常处理类里面创建一个异常处理方法
//@ControllerAdvice(basePackages = "com.qiu07.xlmall.product.controller")
//@ResponseBody
@RestControllerAdvice(basePackages = "com.qiu07.xlmall.product.controller")
public class XlmallExceptionContrllerAdvice {
//创建一个异常处理方法
@ExceptionHandler(value = Throwable.class)
public R handleException(Throwable throwable){
return R.error(BizCodeEnume.UNKNOW_EXCEPTION.getCode(), BizCodeEnume.UNKNOW_EXCEPTION.getMsg());
}
}
4、也可以自己定义处理某个异常的处理方法
//@ControllerAdvice(basePackages = "com.qiu07.xlmall.product.controller")
//@ResponseBody
@RestControllerAdvice(basePackages = "com.qiu07.xlmall.product.controller")
@Slf4j
public class XlmallExceptionContrllerAdvice {
//创建一个数据效验异常处理方法
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public R handleVaildException(MethodArgumentNotValidException e){
//日志打印看一下异常类型
log.error("数据效验出现异常{},异常类型{}",e.getMessage(),e.getClass());
BindingResult bindingResult = e.getBindingResult();
Map<String,String> errorMap = new HashMap<>();
bindingResult.getFieldErrors().forEach((fieldError -> {
errorMap.put(fieldError.getField(),fieldError.getDefaultMessage());
}));
return R.error(BizCodeEnume.VAILD_EXCEPTION.getCode(),BizCodeEnume.VAILD_EXCEPTION.getMsg()).put("data",errorMap);
}
//全局异常处理类
@ExceptionHandler(value = Throwable.class)
public R handleException(Throwable throwable){
return R.error(BizCodeEnume.UNKNOW_EXCEPTION.getCode(), BizCodeEnume.UNKNOW_EXCEPTION.getMsg());
}
}