当前位置: 首页 > article >正文

深入理解Java自定义异常与全局异常处理 @RestControllerAdvice

        异常主要是包括编译时的异常运行时的异常。编译时的异常可以通过捕获异常获取,运行时候的异常主要是通过代码规范,或者测试

        Spring Boot提供了两种异常处理方式来统一处理和维护异常信息

        第一种方式是使用@RestControllerAdvice注解与@ExceptionHandler注解配合使用。第二种方式是ErrorController类,因为第一种方式主要是捕获在接口类的异常,如果需要自定义处理特定的HTTP错误代码(404,401),未进入控制器的和自定义错误页面,则需要使用ErrorController。

        一般来说,只使用@RestControllerAdvice+@ExceptionHandler就够了。

  • @ControllerAdvice:可以用来实现对Controller全局异常处理,与传统的基于AOP的方法不同,使用@ControllerAdvice可以捕获所有Controller中抛出的异常,而无需在每个Controller中配置@ExceptionHandler。通过在该类中使用@ExceptionHandler注解,可以根据不同的异常类型定义相应的处理方法。 @ControllerAdvice需要配合@ExceptionHandler一起使用。

  • @RestControllerAdvice是集合了@ControllerAdvice+@ResponseBody的功能,只是以JSON格式返回处理结果。


创建个exception包:在其中创建自定义异常类

自定义异常:

public class SystemException extends RuntimeException {
​
    private int code;
​
    private String msg;
    
    //获取枚举类中的code
    public int getCode() {
        return code;
    }
    //获取枚举类中的msg
    public String getMsg() {
        return msg;
    }
​
    public SystemException(RespBeanEnum respBeanEnum) {
        //表示调用父类(RuntimeException)的构造方法,并传入respBeanEnum.getMsg()作为参数
        super(respBeanEnum.getMsg());
        this.code = respBeanEnum.getCode();
        //这个其实是多余的,在super()方法中就已经传了msg,不过便于阅读。
        this.msg = respBeanEnum.getMsg();
    }
​
}

        SystemException构造方法的参数是RespBeanEnum:

        定义一个枚举类,列出所有可能的错误类型,并为每个错误类型指定一个对应的错误码和错误消息。然后在自定义异常类中引用该枚举类,并使用其中的错误码和错误消息来初始化异常对象。

public enum RespBeanEnum {   
    int code;
    String msg; 
    SUCCESS(200, "操作成功"),
    ERROR(500, "出现错误");
    
    RespBeanEnum(int code, String errorMessage) {
        this.code = code;
        this.msg = errorMessage;
    }
    public int getCode() {
        return code;
    }
​
    public String getMsg() {
        return msg;
    }
}
  • 解释1:

    super(respBeanEnum.getMsg())这个方法是调用父类的构造方法。最上面是:

public Throwable(String message) {
    fillInStackTrace();
    detailMessage = message;
}

        它的作用是利用父类的异常处理机制RuntimeExpetion,其包含了父类的一些异常处理机制,如堆栈轨迹,异常链的部分。则得在自定义异常类的构造方法中使用super(msg)

        通过super(respBeanEnum.getMsg())将错误消息传递给父类的构造方法,用于创建一个带有指定错误消息的自定义异常对象 SystemException

通过结合枚举类,可以有以下优势:

  1. 错误分类清晰明确:枚举类可以将各种错误类型进行分类,使得代码的错误处理更具可读性和可维护性。

  2. 统一管理错误信息:在枚举类中定义错误码和错误消息,可以集中管理和维护所有错误信息,方便后续的修改和扩展

  3. 可拓展性:通过扩展枚举类,可以轻松添加新的错误类型,而无需修改和添加大量的代码。

自定义全局异常处理:

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    //处理自定义异常
    @ExceptionHandler(SystemException.class)
    public RespBean systemExceptionHandler(SystemException e) {
        //打印异常信息
        log.error("出现了异常! {}", e);
        //从异常对象中获取提示信息封装返回
        //实际上e.getCode() 和 e.getMsg()返回的值就是枚举类定义的属性值
        return RespBean.errorResult(e.getCode(), e.getMsg());
    }

    //处理其他异常
    @ExceptionHandler(Exception.class)
    public RespBean exceptionHandler(Exception e) {
        //打印异常信息
        log.error("出现了异常! {}", e);
        //从异常对象中获取提示信息封装返回
        return RespBean.errorResult(RespBeanEnum.SYSTEM_ERROR.getCode(), e.getMessage());
    }
}
ERROR(500, "出现错误"),得到枚举类的code


http://www.kler.cn/a/131666.html

相关文章:

  • 面试其他注意事项
  • 解决 vue3 element 表格和图片预览样式有冲突
  • Word软件手动安装Zotero插件
  • vmware安装MacOS以及flutter遇到的问题
  • vscode终端npm install报错
  • 【电路笔记】-快速了解无源器件
  • 飞书开发学习笔记(七)-添加机器人及发送webhook消息
  • van-dialog弹窗异步关闭-校验表单
  • 三、Eureka注册中心
  • TSINGSEE视频汇聚管理与AI算法视频质量检测方案
  • 【918.环形子数组的最大和】
  • 【Java 语言】读取 properties 配置文件 ( Java 语言中的 properties 配置文件 | 使用 properties 配置文件 )
  • 叮!您收到了一封来自达坦科技的Hackthon邀请函
  • 基于plc的柔性制造系统供料检测单元的设计(论文+源码)
  • Swagger使用
  • 此芯科技加入绿色计算产业联盟,参编绿色计算产业发展白皮书
  • s28.CentOS、Ubuntu、Rocky Linux系统初始化脚本v6版本
  • 云计算发展
  • LVGL 日历组件
  • 代码随想录 11.17 || 动态规划 LeetCode 647.回文子串、516.最长回文子序列