3、定制错误处理逻辑

  • 自定义错误页
    • error/404.html error/5xx.html;有精确的错误状态码页面就匹配精确,没有就找 4xx.html;如果都没有就触发白页3、定制错误处理逻辑_第1张图片

  • @ControllerAdvice+@ExceptionHandler处理全局异常:底层是 ExceptionHandlerExceptionResolver 支持处理的

  • @ResponseStatus+自定义异常 :底层是 ResponseStatusExceptionResolver支持处理的 ,把responsestatus注解的信息拿来,然后底层调用 response.sendError(statusCode, resolvedReason);这个sendError方法相当于直接告诉tomcat给我发/error请求,请求的错误信息是statusCode,原因是resolvedReason

    这个/error其实就是映射到‘默认没有任何人能处理异常,如果没有任何人能处理最终底层就会发送 /error 请求。会被底层的BasicErrorController处理’这个流程。
    

  • Spring底层的异常,如 参数类型转换异常DefaultHandlerExceptionResolver 处理spring框架底层的异常。
    • response.sendError(HttpServletResponse.SC_BAD_REQUEST, ex.getMessage());3、定制错误处理逻辑_第2张图片

  • 自定义异常解析器:实现 HandlerExceptionResolver 处理异常;可以把优先级调高,让他作为默认的全局异常处理规则。发生任何异常都是他来处理。

    @Order(value = Ordered.HIGHEST_PRECEDENCE)  //优先级,数字越小优先级越高
    @Component
    public class CustomerHandlerExceptionResolver implements HandlerExceptionResolver {
    
      @Override
      public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
          try {
              response.sendError(505,"我喜欢的异常");
          }catch (IOException e){
              e.printStackTrace();
          }
          return new  ModelAndView();
      }
    }

    默认级别以及最高和最低级别:
    3、定制错误处理逻辑_第3张图片
    image.png

下面可以看到我们自定义的异常处理类已经在第一名了

3、定制错误处理逻辑_第4张图片


  • ErrorViewResolver 实现自定义处理异常;(这个一般不去自定义)
    • tomcat只要一感知到使用response.sendError跳转页面 。/error请求就会转给controller

      • 转给controller的方式有两个:
      • 第一个是明显的调用sendError;
      • 第二个是你的异常没有任何人能处理(异常解析器返回的ModelAndView为null)。tomcat底层 response.sendError。error请求就会转给controller
    • basicErrorController 要去的页面地址是 ErrorViewResolver 解析 ;
    • 最终只要没人能解析异常,都会被basicErrorController 捕获。

你可能感兴趣的:(java)