一、前言
SpringBoot框架对异常的处理提供了几种很强大的方法,我们可以通过@ControllerAdvice和@ExceptionHandler注解实现全局异常的处理,也可以通过实现HandlerExceptionResolve接口来完成全局异常的处理。
二、全局异常处理方式一
通过@ControllerAdvice和@ExceptionHandler注解实现全局异常拦截,它可以拦截controller层请求方法抛出的异常信息,同时外加@ ResponseBody注解,可以实现响应类型为json格式。或者直接使用@RestControllerAdvice和@ExceptionHandler注解的方式实现响应类型为json格式的数据。
1.添加依赖
2.自定义异常类
3.全局异常处理类
包含对自定义异常和空指针异常的处理。
4.创建控制层测试
5.启动程序并访问请求进行测试
测试空指针异常
测试自定义服务异常
其他异常
6.404异常特殊处理
默认情况下,@ExceptionHandler注解无法捕捉到 404 异常,比如请求一个无效的地址,返回信息如下:
如果想要捕捉到这种异常,可以在application.properties文件中添加如下配置来实现。
启动服务,再次发起地址请求,结果如下:
7.自定义异常页面的实现
某些场景下,当发生异常时希望跳转到自定义的异常页面,如何实现呢?
首先,这里基于thymeleaf模板引擎来开发页面,在templates目录下创建一个异常页面error.html。
我们重新修改一下全局异常处理类,让异常返回结果到页面中。
我们重新请求刚才不存在的访问时,这个时候跳转到了页面,并在页面中显示了异常的信息。
三、全局异常处理方式二
在 Spring Boot 中,除了通过@ControllerAdvice和@ExceptionHandler注解实现全局异常处理外,还有一种通过实现HandlerExceptionResolver接口来完成全局异常的处理。
具体实现示例如下:
如果是空指针异常的话会返回json数据格式,如果是其他异常会在页面上显示异常的信息。
其他异常
空指针异常
虽然这种方式能够处理全局异常,但是 Spring 官方不推荐使用它;同时实测过程中发现它无法拦截 404 错误,当请求错误地址时,会优先被DefaultHandlerExceptionResolver默认异常处理类拦截,自定义的异常处理类无法捕捉。