Catalog
- SpringBoot工程下的全局异常处理
- 一、需求
- 二、实现
SpringBoot工程下的全局异常处理
一、需求
程序运行过程中没法保证一定不会出错,即程序中会报异常,而系统默认的异常信息的格式往往和我们自定义返回的消息格式不一致,还会影响返回到前端的页面,这里SpringMVC为我们提供了一种全局异常处理器,可以根据异常的类型捕获程序运行过程中可能会抛出的异常,从而对异常进行处理,包括捕获到这个异常给前端返回什么消息等等。
二、实现
处理异常一般有两种方式:
- 使用try-catch语句直接在控制器中对异常进行处理(较为繁琐)
- 使用全局异常处理器(SpringMVC提供)
这里主要介绍全局异常处理器,使用全局异常处理器可以通过添加注解(@RestControllerAdvice)来实现或者通过实现HandlerExceptionResolver
接口来实现(这种方式更加灵活,但需要编写的代码也更繁琐),下面介绍通过注解的方式添加全局异常处理器。
-
创建一个全局处理异常类(一般取名-GlobalExceptionHandler);
-
添加注解@RestControllerAdvice到全局异常处理类上面,(这个是ControllerAdvice和ResponseBody的复合注解,用于返回json类型的数据);
-
定义异常处理的方法,在这个方法上添加@ExceptionHandler注解(可指明需要捕获的异常类型);
-
添加异常方法形参(一般和@ExceptionHandler注解中指明的异常类类型保持一致)
-
最后在方法内自定义怎么处理这个异常,需要返回什么格式的消息即可。
-
一个小Demo(注意异常类放到启动类的包或者子包下面,让Spring容器扫描到)
@Slf4j @RestControllerAdvice public class GlobalExceptionHandler {@ExceptionHandler(RuntimeException.class)@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) //手动设置该方法被调用时返回的状态码,而不是使用默认的状态码public ResultData<String> getGlobalExceptionHand(RuntimeException e){ResultData<String> resultData = new ResultData<>();resultData.setCode(ReturnCodeEnum.RC500.getCode());resultData.setMessage(e.getMessage());resultData.setData("服务器内部故障!");return resultData;}}