在 Spring Boot 项目开发中,异常处理是一个非常重要的环节。良好的异常处理不仅能提高应用的健壮性,还能提升用户体验。本文将介绍如何在 Spring Boot 项目中实现统一异常处理。
统一异常处理有以下几个优点:
- 提高代码可维护性:异常处理逻辑集中管理,减少了代码的冗余和分散。
- 提升用户体验:用户能看到一致且友好的错误信息,而不是杂乱的堆栈跟踪。
- 安全性:避免将敏感的错误信息暴露给用户。
使用 @ControllerAdvice 和 @ExceptionHandler 实现统一异常处理
Spring 提供了 @ControllerAdvice
注解用于集中处理控制器层的全局异常。@ExceptionHandler
注解用于定义具体的异常处理方法。下面是一个基本的示例:
1. 创建异常处理类
首先,我们创建一些自定义异常处理类,以便可以捕捉到controller中出现的异常,防止直接报给前端500的错误码:
@ControllerAdvice //添加完此注解后,此类随着springboot项目的启动而启动,并且会监控controller的异常.监听项目中所有的异常
@ResponseBody
public class MyExceptionAdvice {
//这里的一场都是意外异常,并不是业务异常,业务异常后端controller会处理返回给前端.业务异常会和前端沟通好已规定的状态码返回。
@ExceptionHandler(NullPointerException.class)
public HashMap<String,Object> doNullPointerException(NullPointerException e){
HashMap<String, Object> res = new HashMap<>();
res.put("code",-1);
res.put("msg","空指针异常"+e.getMessage());
res.put("data",null);
return res;
}
// 默认的异常处理,当有有异常出现的时候,会先匹配子类的异常,当所有的异常都没有匹配的时候就会走这一条默认的一场路线业务。
@ExceptionHandler(Exception.class)
public HashMap<String,Object> doException(Exception e){
HashMap<String, Object> res = new HashMap<>();
res.put("code",-1);
res.put("msg","异常"+e.getMessage());
res.put("data",null);
return res;
}
}
使用@ExceptionHandler 注解的时候,需要传入异常类。使用注解的方法名和返回值都可以自定义,但是传入的变量要和注解中传入的异常类保持一致。
我们也不可能将所有可能出现的异常都列举出来,那该怎么办呢?我们只需要针对所有异常类的父类Exception进行异常处理即可
2. 触发异常观察结果
controller代码:
我们现在访问 http://127.0.0.1:8080/user/login :
确实通过AOP的思想捕获到项目中出现的异常了,并且代码完全没有侵入到项目的业务代码中。
如果我们不进行这些异常处理会是怎么样的结果,我们注解去掉注解让异常处理失效,再次访问login,观察结果:
这样的结果并不是优秀的项目该有的,显得和挫啊。
总结