3、定制错误处理逻辑

  • 自定义错误页
    • error/404.html error/5xx.html;有精确的错误状态码页面就匹配精确,没有就找 4xx.html;如果都没有就触发白页3、定制错误处理逻辑
      文章图片
  • @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、定制错误处理逻辑
      文章图片
  • 自定义异常解析器:实现 HandlerExceptionResolver 处理异常;可以把优先级调高,让他作为默认的全局异常处理规则。发生任何异常都是他来处理。
    @Order(value = https://www.it610.com/article/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 newModelAndView(); } }

    默认级别以及最高和最低级别:
    3、定制错误处理逻辑
    文章图片

    3、定制错误处理逻辑
    文章图片

下面可以看到我们自定义的异常处理类已经在第一名了
3、定制错误处理逻辑
文章图片

  • ErrorViewResolver 实现自定义处理异常;(这个一般不去自定义)
    • 【3、定制错误处理逻辑】tomcat只要一感知到使用response.sendError跳转页面 。/error请求就会转给controller
      • 转给controller的方式有两个:
      • 第一个是明显的调用sendError;
      • 第二个是你的异常没有任何人能处理(异常解析器返回的ModelAndView为null)。tomcat底层 response.sendError。error请求就会转给controller
    • basicErrorController 要去的页面地址是 ErrorViewResolver 解析 ;
    • 最终只要没人能解析异常,都会被basicErrorController 捕获。

    推荐阅读