目录
7.10 Web原生组件注入(Servlet、Filter、Listener)
第七章 Web开发
7.9 错误处理
7.9.1 默认规则
参考:Web
- 默认情况下,SpringBoot提供一个映射/error,处理所有错误
-
对于机器客户端,它将生成JSON响应,其中包含错误、HTTP状态和异常消息的详细信息,将这些信息显示在页面上
-
对于浏览器客户端,响应一个"whitelabel(白页)"错误视图,以HTML格式呈现相同的数据
-
要进行自定义,可以添加View解析为error
-
要完全替换默认行为,可以实现ErrorController,并注册该类型的Bean定义,或者添加ErrorAttributes类型的组件,以实现使用现有机制替换其内容
-
public/templates下的error文件夹下的4xx、5xx页面会被自动解析
-
7.9.2 定制错误处理逻辑
- 自定义错误页
- error/404.html error/5xx.html:有精确的错误状态码页面就匹配精确,没有就找 4xx.html,如果都没有就触发白页
- @ControllerAdvice+@ExceptionHandler处理全局异常,底层是处理器异常解析器ExceptionHandlerExceptionResolver支持的
/**
* 处理整个Web controller的异常
*/
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler({ArithmeticException.class,NullPointerException.class}) //处理异常
public String handleArithException(Exception e){
log.error("异常是:{}",e);
return "login";//返回一个视图地址
}
}
- @ResponseStatus+自定义异常:底层是ResponseStatusExceptionResolver,把responsestatus注解的信息底层调用response.sendError(statusCode, resolvedReason);tomcat发送的/error
@ResponseStatus(value = HttpStatus.FORBIDDEN,reason = "用户数量太多") //可以传入Http状态码、错误原因
public class UserTooMuchException extends RuntimeException{//自定义异常类
public UserTooMuchException() {
}
public UserTooMuchException(String message) {
super(message);
}
}
-
Spring底层的异常,如参数类型转换异常、参数不存在异常。由处理器异常解析器DefaultHandlerExceptionResolver处理框架底层的异常
- response.sendError(HttpServletResponse.SC_BAD_REQUEST, ex.getMessage());
- 自定义实现HandlerExceptionResolver处理异常,实现HandlerExceptionResolver接口,修改优先级后可以作为默认的全局异常处理规则
@Order(value = Ordered.HIGHEST_PRECEDENCE)//给当前异常解析器一个最高优先级,超过之前的DefaultHandlerExceptionResolver
@Component
public class CustomerHandlerExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response,
Object handler, Exception ex) {
try{
response.sendError(511,"自定义的错误状态码");//也会被5xx.html页面处理
} catch (IOException e) {
e.printStackTrace();
}
return new ModelAndView();
}
}
- ErrorViewResolver,实现自定义处理异常(最底层的一种异常处理)
- response.sendError,error请求就会转给controller
- 你的异常没有其他任何人能处理,tomcat底层response.sendError,error请求就会转给controller
-
basicErrorController要去的页面地址是ErrorViewResolver