自定义错误页面error/404.htmlerror/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)//优先级,数字越小,优先级越高@ComponentpublicclassCustomerHandlerExceptionResolverimplementsHandlerExceptionResolver{@OverridepublicModelAndViewresolveException(HttpServletRequestrequest,HttpServletResponseresponse,Object{exh.sendError(505,"Myfavoriteexception");}catch(IOExceptione){e.printStackTrace();}returnnewModelAndView();}}默认级别和最高最低级别:下面可以看到我们自定义的异常处理类已经先来,ErrorViewResolver实现异常的自定义处理;(这个一般不会自定义)只要tomcat感知到,使用response.sendError跳转到页面,/error请求传递给controller有两种方式:第一种很明显是调用sendError;二是没有人能处理你的异常(异常解析器返回的ModelAndView为null),Tomcat底层response.sendError,错误请求会转发给controllerbasicErrorController。待解析页面地址为ErrorViewResolver;最后,只要没有人能解决这个异常,就会被basicErrorController捕获。
