统一异常处理

一、为什么要使用统一异常处理?

  1. 集中处理异常:通过统一异常处理,可以将所有的异常情况集中处理,避免在每个接口或方法中都编写繁琐的异常处理代码。这样可以提高代码的可维护性和可读性。

  2. 统一返回格式:通过统一异常处理,可以定义统一的返回格式,使得客户端能够更方便地理解和处理异常情况。可以将异常信息按照指定的格式进行封装,比如JSON格式,包含错误码、错误信息等,便于前端或其他服务进行处理。

  3. 异常信息层级化:通过统一异常处理,可以将不同类型的异常进行层级划分,定义不同的异常类,并针对不同的异常类型进行相应的处理。例如,可以定义业务异常、参数异常、系统异常等不同的异常类,然后在异常处理器中针对不同的异常类型进行分类处理。

  4. 统一日志记录:通过统一异常处理,可以在异常处理器中记录日志,对异常情况进行统一的日志记录,便于后期的分析和问题定位。

  5. 异常信息友好化:通过统一异常处理,可以将系统内部的异常信息转换成用户友好的提示信息,避免将敏感的错误信息暴露给客户端。这样可以增强系统的安全性和用户体验。

总之,使用统一异常处理可以提高代码的可维护性和可读性,减少重复代码,统一异常返回格式,层级化处理异常,便于日志记录和问题定位,同时改善系统的安全性和用户体验。

二、简单编写步骤,

关键就是在  注解@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());
    }

}

5、模拟请求异常

成功捕获到了异常

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值