乐趣区

关于java:3定制错误处理逻辑

  • 自定义谬误页
    • error/404.html error/5xx.html;有准确的谬误状态码页面就匹配准确,没有就找 4xx.html;如果都没有就触发白页

  • @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());

  • 自定义异样解析器 :实现 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();}
    }

    默认级别以及最高和最低级别:

上面能够看到咱们自定义的异样解决类曾经在第一名了


  • ErrorViewResolver 实现自定义解决异样 ;(这个个别不去自定义)
    • tomcat 只有一感知到应用 response.sendError 跳转页面。/error 申请就会转给 controller

      • 转给 controller 的形式有两个:
      • 第一个是显著的调用 sendError;
      • 第二个是你的异样没有任何人能解决(异样解析器返回的 ModelAndView 为 null)。tomcat 底层 response.sendError。error 申请就会转给 controller
    • basicErrorController 要去的页面地址是 ErrorViewResolver 解析;
    • 最终只有没人能解析异样,都会被 basicErrorController 捕捉。
退出移动版