Spring Boot 中异常处理

1. Spring Boot 中使用拦截器

⏰ 关键代码

  • 🌏 使用 @RestControllerAdvice 拦截所有 controller 异常,使用 @ExceptionHandler 标记需要处理的异常
    @RestControllerAdvice
    public class SimpleExceptionHandler {
        @ExceptionHandler(RuntimeException.class)
        @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
        public void simpleExceptionHandlerMethod(RuntimeException e){
           ...
        };
      }
    
⏰ Maven依赖

  • 🌏 pom.xml 中使用如下依赖,如下:
       <dependencies>
           <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-starter</artifactId>
           </dependency>
           <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-starter-test</artifactId>
               <scope>test</scope>
           </dependency>
           <!--web 项目依赖-->
           <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-starter-web</artifactId>
           </dependency>
       </dependencies>
    
⏰ Controller中定义web接口

  • 🌏 程序中,创建 SimpleExceptionController 类,定义 simpleWebApinullWebApi 接口,模拟web请求。如下:
    @Slf4j
    @RestController
    public class SimpleExceptionController {
        @GetMapping("simpleWebApi")
        public void simpleWebApi(){
            throw new RuntimeException("运行时异常");
        }
        @GetMapping("nullWebApi")
        public void nullWebApi()  {
            throw new NullPointerException("空指针异常");
        }
    }
    
⏰ 定义异常处理类

  • 🌏 定义 SimpleExceptionHandler 异常处理类
    /**
     * @RestControllerAdvice 是 @ControllerAdvice 和 @ResponseBody 的集合
     * 默认扫描 basePackages 下的类
     */
    @RestControllerAdvice
    public class SimpleExceptionHandler {
        /**
         *  异常类范例
         * @param e 抛出的异常类
         * @return
         */
        @ExceptionHandler(RuntimeException.class)
        @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
        public String simpleExceptionHandlerMethod(RuntimeException e){
            return e.getMessage();
        };
        /**
         * 常见请求参数
         * 更多见: https://docs.spring.io/spring-framework/docs/5.3.2/reference/html/web.html#mvc-ann-exceptionhandler-args
         * @param request  http请求报文的request
         * @param response http请求报文的response
         * @param handlerMethod  引发异常的控制器方法
         * @param e 抛出的具体异常
         * @return
         */
        @ExceptionHandler(NullPointerException.class)
        @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
        public Map<String,String> argumentsAndReturnValueExceptionHandlerMethod(ServletRequest request, ServletResponse response, HttpMethod httpMethod, HandlerMethod handlerMethod, NullPointerException e){
            Map<String,String> rMap = new HashMap<>();
            rMap.put("错误信息",e.getMessage());
            return rMap;
        };
    }
    

    @RestControllerAdvice 中包含了 @ControllerAdvice@ResponseBody ,支持直接返回 JSON 数组。@ExceptionHandler 指定处理的异常类,@ResponseStatus 指定 response码。
    @ExceptionHandler 所在的方法,对参数有限制,常用的有 ServletRequest(http请求报文的request),ServletResponse(http请求报文的response),HandlerMethod(引发异常的控制器方法),Exception(接收的异常类)。
    最常用的返回值为 Map

⏰ 请求接口,查看打印

  • 🌏 浏览器中访问 localhost:8080/simpleWebApi,查看返回
    运行时异常
    
  • 🌏 浏览器中访问 localhost:8080/nullWebApi,查看返回
     {
         "错误信息": "空指针异常"
     }
    
⏰ 拓展
  • 🌏 可以在 @RestControllerAdvice 注解中指定包路径,类,或者Controller处理器注解,来缩小捕捉异常的范围。

🐟 Hi~ o( ̄▽ ̄)ブ 🌱参考文档
🐋 Hi~ o( ̄▽ ̄)ブ 🌱源码地址

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值