异常处理
默认规则:
-
默认情况下,Spring Boot提供/error处理所有错误的映射
-
机器客户端,它将生成JSON响应,其中包含错误,HTTP状态和异常消息的详细信息。对于浏览器客户端,响应一个“ whitelabel”错误视图,以HTML格式呈现相同的数据
{
"timestamp": "2021-03-12T10:34:22.787+00:00",
"status": 404,
"error": "Not Found",
"message": "No message available",
"path": "/basic_tabdsdsd"
}
-
要对其进行自定义,添加View解析为error
-
要完全替换默认行为,可以实现 ErrorController并注册该类型的Bean定义,或添加ErrorAttributes类型的组件以使用现有机制但替换其内容。
-
/templates/error/下的4xx,5xx页面会被自动解析
可以直接在5xx页面直接拿到错误信息
自定义错误页
- 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.info("异常是{}", e);
return "login";//视图地址
}
}
- @ResponseStatus+自定义异常 ;底层是 ResponseStatusExceptionResolver ,把responsestatus注解的信息底层调用 response.sendError(statusCode, resolvedReason);tomcat发送的/error
/**
* 用户太多异常
*/
@ResponseStatus(value = HttpStatus.FORBIDDEN,reason = "用户数量太多")
public class UserTooManyException extends RuntimeException{
public UserTooManyException() {
super();
}
public UserTooManyException(String message) {
super(message);
}
}
@GetMapping("/dynamic_table.html")
public String dynamic_table(Model model) {
//表格内容的遍历
List<User> users = Arrays.asList(new User("ayan", "123456"),
new User("achao", "123444"),
new User("haha", "aaaaa"),
new User("hehe ", "aaddd"));
model.addAttribute("users", users);
if (users.size() > 3) {
throw new UserTooManyException();
}
return "table/dynamic_table";
}
- 自定义实现 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(511,"我喜欢的错误");
} catch (IOException e) {
e.printStackTrace();
}
return new ModelAndView();
}
}
- ErrorViewResolver 实现自定义处理异常
- response.sendError(),error请求就会转给controller。
- 你的异常没有任何人能处理,tomcat底层调用response.sendError(),error请求就会转给controller。
- basicErrorController 要去的页面地址是 ErrorViewResolver 。