十二、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.addObjectModelAndView.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;
    }
}