十二、Spring Boot 异常处理
- (一)、自定义错误页面
- 1.默认异常处理方式
- 2.异常输出配置
- 3.自定义异常输出页面
- (二)、@ExceptionHandler异常
- (三)、@ControllerAdvice + @ExceptionHandler
- (四)、SimpleMappingExceptionResolver
- (五)、HandlerExceptionResolver
(一)、自定义错误页面
注:
- 所有异常统一跳转同一个页面
error.html
, - 自定义错误页面名称必须为
error.html
- 自定义错误页面通过
exception
获取异常信息; -
error.html
对所有controller都有效果,其它controller的异常也会跳转至此页面。
1.默认异常处理方式
SpringBoot 默认的处理异常的机制:SpringBoot 默认的已经提供了一套处理异常的机制。
一旦程序中出现了异常 SpringBoot 会像/error 的 url 发送请求。在 springBoot 中提供了一个
叫 BasicExceptionController 来处理/error 请求,然后跳转到默认显示异常的页面来展示异常
信息。
2.异常输出配置
application.properties文件配置异常输出:
server.error.include-exception=true
3.自定义异常输出页面
注:页面名称必须为error.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>自定义错误页面</title>
</head>
<body>
出错了...
<br>
原因:<span th:text="${exception}"></span>
</body>
</html>
(二)、@ExceptionHandler异常
注:只能处理当前controller中出现的异常
controller中添加异常处理:
@ExceptionHandler(value = {java.lang.NullPointerException.class})
public ModelAndView nullPointerException(Exception e){
ModelAndView mv = new ModelAndView();
mv.addObject("error", e.toString());
mv.setViewName("nullException");
return mv;
}
- @ExceptionHandler,捕捉异常。value可以设置多个异常然后通过
ModelAndView.addObject
和ModelAndView.setViewName
处理不同异常,也可以创建多个方法添加注解@ExceptionHandler
分别处理。
(三)、@ControllerAdvice + @ExceptionHandler
- 可处理全局异常,所有controller中的异常都可以捕捉到;
- 创建自定义controller类集中处理异常;
- 自定义controler添加注解
@ControllerAdvice
- 添加异常处理方法。
代码:
@ControllerAdvice
public class ExceptionController {
@ExceptionHandler(value = java.lang.NullPointerException.class)
public ModelAndView nullPointerException(Exception e){
ModelAndView mv = new ModelAndView();
mv.addObject("error", e.toString());
mv.setViewName("controllerAdviceException");
return mv;
}
}
(四)、SimpleMappingExceptionResolver
- 指定不同异常跳转至不同页面,无法异常原因;
- 创建自定义controller处理各种不同异常;
- 自定义controller添加注解
@Configuration
; - 创建自定义方法且方法返回值类型为
SimpleMappingExceptionResolver
,处理异常 - 方法添加注解
@Bean
.。
代码:
@Configuration
public class GlobalException {
@Bean
public SimpleMappingExceptionResolver getExceptionResolver(){
SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
Properties properties = new Properties();
// 异常类型 - 跳转视图,可put多个
properties.put("java.lang.NullPointerException", "exception1");
resolver.setExceptionMappings(properties);
return resolver;
}
}
(五)、HandlerExceptionResolver
- 指定不同异常跳转至不同页面,可获取异常原因;
- 创建自定义controller处理各种不同异常;
- 自定义controller添加注解
@Configuration
并且实现接口HandlerExceptionResolver
- 重载方法
resolveException
,处理不同异常跳转页面。
代码:
@Configuration
public class GlobalException implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
ModelAndView modelAndView = new ModelAndView();
// 处理不同异常
if(ex instanceof NullPointerException){
modelAndView.setViewName("nullException");
}
if (ex instanceof ArithmeticException) {
modelAndView.setViewName("arithmeticException");
}
modelAndView.addObject("error", ex.toString());
return modelAndView;
}
}