开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第26天,点击查看活动详情
前言
在Spring项目中,我们在项目创建时必须要解决的问题就是如何把项目中的异常统一起来处理,否则在后期项目开发中,因为没有很好地管理项目异常导致项目维护起来非常困难,也会影响前后端开发效率,所以我们在这篇文章中简单讲述一下如何实现统一异常处理;
创建RestControllerAdvice
首先,我们创建一个被@RestControllerAdvice注解的类,这个类可以对Controller进行增强,这样的话,我们就可以拦截到Controller中抛出的异常了:
import com.example.awesomespring.exception.AwesomeException;
import com.example.awesomespring.vo.ResultWrap;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.AuthorizationException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author zouwei
* @className ExceptionHandler
* @date: 2022/8/6 下午10:44
* @description:
*/
@Slf4j
@RestControllerAdvice
public class AwesomeExceptionHandler {
/**
* 捕获没有用户权限的异常
*
* @return
*/
@ExceptionHandler(AuthorizationException.class)
public ResultWrap handleException(AuthorizationException e) {
return ResultWrap.failure(401, "您暂时没有访问权限!", e);
}
/**
* 处理AwesomeException
*
* @param e
* @param request
* @param response
* @return
*/
@ExceptionHandler(AwesomeException.class)
public ResultWrap handleAwesomeException(AwesomeException e, HttpServletRequest request, HttpServletResponse response) {
return ResultWrap.failure(e);
}
/**
* 专门针对运行时异常
*
* @param e
* @return
*/
@ExceptionHandler(RuntimeException.class)
public ResultWrap handleRuntimeException(RuntimeException e) {
return ResultWrap.failure(e);
}
}
在上面的代码中,我们分别对三种异常做了拦截:
1.权限异常:这种异常常常是在使用第三方权限框架的时候会出现,因为在项目当中无法针对所有抛出权限异常的地方进行拦截,所以建议最好在异常拦截处考虑到这个异常;
2.自定义异常:这个异常是我们统一异常处理的关键,我们需要把项目当中的大部分业务相关的异常统一为一个异常抛出,这样我们就可以在
Controller处进行一个统一的处理;3.运行时异常:这种异常的出现一般就是开发人员的编码错误造成的,但是是可以避免的,我们一定要拦截到这种异常,并在出现这个异常的时候尽快修正错误的代码;
注意:上述三种异常并不代表所有被拦截的异常,比如参数校验框架抛出的异常咱们这里没有拦截,所以小伙伴们可以根据自己的实际情况来做异常拦截处理;
说明
我们除了可以使用@RestControllerAdvice注解外,还可以使用@ControllerAdvice,不过@ControllerAdvice需要额外补充@ResponseBody注解,其中原理和@RestController一样;如果项目中需要根据异常返回视图的话,那么使用@ControllerAdvice并且不要添加@ResponseBody注解,只有在返回数据都要求json或xml等结构化数据时才会使用@RestControllerAdvice注解或补充@ResponseBody注解;