21.springboot的错误处理

 用法:使用模板引擎进行处理
 在templates新增error文件夹如图:

定制错误解析逻辑
一:第一种方式:(@ControllerAdvice和@ExceptionHandler处理全局异常;底层是ExceptionHandlerExceptionResource支持的)
        重点1:@ControllerAdvice标签标定当前类处理异常
        @ControllerAdvice
        @Slf4j
        public class GilobalExceptionHandler {
            //重点2: @ExceptionHandle表示当前方法可以处理哪些异常,传入数组
            @ExceptionHandler({ArithmeticException.class,NullPointerException.class})
            //重点4:传入参数Exception e,来接受异常!
            public String handlerAdvice(Exception e){
                //重点3:最后返回的跟springboot的普通controller一致,返回string(表示跳转地址),也可以返回ModelAndView(存入数据,在页面上调用)
                log.error("异常是:{}",e);
                return "error/5xx";
            }
        }
        

二:第二种方式(@ResponseStatus+自定义异常;底层是ResponseStatusExceprtionResoulver,把responseStatus注解的信息组装成ModelAndView返回)
        1.重点1:@ResponseStatus指定状态码和对应的错误信息,底层会将其放入到modelAndView中,message<===>reason
        @ResponseStatus(value = HttpStatus.BAD_REQUEST,reason = "用户数太多了")
        public class UserTooManyException extends RuntimeException{
            public UserTooManyException() {
                
            }
            public UserTooManyException(String message) {
                super(message);
            }
        }
        其他地方调用:
            @Controller
            public class ThymealfController {
                @GetMapping("/hello")
                public String getThymealf(@RequestParam("aa") int aa ){
                    if(aa==3){
                        重点2:抛出自定义异常好! 
                        throw new UserTooManyException();
                    }
                    return "/myHtml/success";
                }
            }
            
            
三:自定义异常解析器:
        样例代码如下:
            /**
         * 自定义的异常解析器
         */
         重点1:@Order设置自定义异常解析的优先级,数字越小优先级越高,
         因为springboot底层也有其他的异常解析规则,默认自定义异常解析规则排在最后,如果异常被前面的异常解析规则捕获到,就不会轮到自定义的异常解析规则,
         所以此处将自定义的异常解析规则调制最高标准
        @Order(value = Ordered.HIGHEST_PRECEDENCE)
        @Component
        重点2:自定义异常解析规则实现HandlerExceptionResolver 类
        public class WmdCustomerHandlerExceptionResolver implements HandlerExceptionResolver {
            @Override
            public ModelAndView resolveException(HttpServletRequest request,
                                                 HttpServletResponse response,
                                                 Object handler,
                                                 Exception ex) {
                try {
                    重点3:调用response.sendError方法时,error请求会转给controler(里面包含了错误信息和状态码,最终去那个页面:ErrorViewResolver会解析状态码,然后去error文件夹下找对应的错误页)
                    response.sendError(511, "吴孟达自定义异常!");
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return new ModelAndView();
            }
        }

posted @ 2022-05-11 22:07  努力的达子  阅读(58)  评论(0编辑  收藏  举报