• Springboot:统一异常处理


    1.简洁

    软件开发过程中,不可避免的是需要处理各种异常,就我自己来说,至少有一半以上的时间都是在处理各种异常情况,所以代码中就会出现大量的try {...} catch {...} finally {...} 代码块,不仅有大量的冗余代码,而且还影响代码的可读性

    我们可以不显式的处理异常,优雅的处理异常吗

    2.统一异常处理

    Spring在3.2版本增加了一个注解@ControllerAdvice,可以与@ExceptionHandler@InitBinder@ModelAttribute 等注解注解配套使用

    不过跟异常处理相关的只有注解@ExceptionHandler,从字面上看,就是 异常处理器 的意思,其实际作用也是:若在某个Controller类定义一个异常处理方法,并在方法上添加该注解,那么当出现指定的异常时,会执行该处理异常的方法,其可以使用springmvc提供的数据绑定,比如注入HttpServletRequest等,还可以接受一个当前抛出的Throwable对象。

    3.流程

    在独立的某个地方,比如单独一个类,定义一套对各种异常的处理机制,然后在类的签名加上注解@ControllerAdvice,统一对 不同阶段的不同异常 进行处理。这就是统一异常处理的原理。

    注意到上面对异常按阶段进行分类,大体可以分成:进入Controller前的异常 和 Service 层异常,具体可以参考下图:

     4.示例

    1. /**
    2. * 全局异常处理
    3. */
    4. //表示处理带有RestController Controller这两种注解的类
    5. @ControllerAdvice(annotations = {RestController.class, Controller.class})
    6. @ResponseBody
    7. @Slf4j
    8. public class GlobalExceptionHandler {
    9. /**
    10. * 异常处理方法
    11. * 该异常可以捕获sql中的insert中unique字段重复的异常
    12. * @return
    13. */
    14. @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
    15. public R exceptionHandler(SQLIntegrityConstraintViolationException ex){
    16. log.error(ex.getMessage());
    17. if(ex.getMessage().contains("Duplicate entry")){
    18. String[] split = ex.getMessage().split(" ");
    19. String msg = split[2] + "已存在";
    20. return R.error(msg);
    21. }
    22. return R.error("未知错误");
    23. }
    24. /**
    25. * 异常处理方法
    26. * @return
    27. */
    28. @ExceptionHandler(CustomException.class)
    29. public R exceptionHandler(CustomException ex){
    30. log.error(ex.getMessage());
    31. return R.error(ex.getMessage());
    32. }
    33. }

    参考:https://www.jianshu.com/p/3f3d9e8d1efa

  • 相关阅读:
    视频去水印免费软件有哪些?快来收藏这三款实用工具
    Redis事务操作
    JVM 内存设置大小(Xms Xmx PermSize MaxPermSize 区别)
    python的公有和私有属性,方法的使用
    frp:开源内网穿透工具
    ros2发布者发布数据(其他程序的数据)
    树的应用 —— 树的简介
    视频怎么压缩?把视频压缩的小一点这样做
    django的orm框架基础使用
    C#/.NET/.NET Core优秀项目和框架2024年1月简报
  • 原文地址:https://blog.csdn.net/m0_63748493/article/details/126608835