在开发中,我们经常会使用try/catch块来捕获异常进行处理,如果有些代码中忘记捕获异常或者不可见的一些异常出现,就会响应给前端一些不友好的提示,这时候我们可以使用全局异常处理。这样就不用在代码中写那些烦人的try/catch块了,代码的可读性也会提高。
SpringBoot提供的的注解@ControllerAdvice表示开启全局异常捕获,在自定义的异常方法上使用ExceptionHandler来进行统一处理。
下面一起看看如何优雅的处理全局异常!
根据业务需求自定义异常,在本文中我定义了两个异常,分别用作响应结果为空时处理和请求参数错误时处理。
@Data public class EmptyResutlException extends RuntimeException { private static final long serialVersionUID = -8839210969758687047L; private int code; private String message; public EmptyResutlException(CodeEnum codeEnum){ this.code = codeEnum.getCode(); this.message = codeEnum.getMessage(); } } @Data public class RequestParamException extends RuntimeException { private static final long serialVersionUID = 4748844811214637041L; private int code; private String message; public RequestParamException(CodeEnum codeEnum){ this.code = codeEnum.getCode(); this.message = codeEnum.getMessage(); } }由于这里我想要响应的结果为实体类对象,因此我直接用@RestControllerAdvice来代替了@ControllerAdvice,这两个注解的差别跟@Controller和@RestController一样,rest的响应体为json格式的数据。
@RestControllerAdvice @Slf4j public class GlobalExceptionHandler { /** * 查询结果为空时处理 * @param e * @return */ @ExceptionHandler(EmptyResutlException.class) public R emptyResultExceptionHandler(EmptyResutlException e){ log.error("查询结果为空:{}",e.getMessage()); R result = new R(); result.fillCode(e.getCode(),e.getMessage()); return result; } /** * 请求参数错误时处理 * @param e * @return */ @ExceptionHandler(RequestParamException.class) public R requestParamExceptionHandler(RequestParamException e){ log.error("请求参数不合法:{}",e.getMessage()); R result = new R(); result.fillCode(e.getCode(),e.getMessage()); return result; } /** * 处理其他异常 * @param e * @return */ @ExceptionHandler(Exception.class) public R exceptionHandler(Exception e){ log.error("未知异常:{}",e.getMessage()); R result = new R(); result.fillCode(CodeEnum.ERROR); return result; } }在实际开发中可以自定义响应状态码的枚举类和自定义异常以满足需求。
spring-boot-route(一)Controller接收参数的几种方式
spring-boot-route(二)读取配置文件的几种方式
spring-boot-route(三)实现多文件上传
spring-boot-route(四)全局异常处理
spring-boot-route(五)整合swagger生成接口文档
spring-boot-route(六)整合JApiDocs生成接口文档
spring-boot-route(七)整合jdbcTemplate操作数据库
spring-boot-route(八)整合mybatis操作数据库
spring-boot-route(九)整合JPA操作数据库
spring-boot-route(十)多数据源切换
spring-boot-route(十一)数据库配置信息加密
spring-boot-route(十二)整合redis做为缓存
spring-boot-route(十三)整合RabbitMQ
spring-boot-route(十四)整合Kafka
spring-boot-route(十五)整合RocketMQ
spring-boot-route(十六)使用logback生产日志文件
spring-boot-route(十七)使用aop记录操作日志
spring-boot-route(十八)spring-boot-adtuator监控应用
spring-boot-route(十九)spring-boot-admin监控服务
spring-boot-route(二十)Spring Task实现简单定时任务
spring-boot-route(二十一)quartz实现动态定时任务
spring-boot-route(二十二)实现邮件发送功能
spring-boot-route(二十三)开发微信公众号
这个系列的文章都是工作中频繁用到的知识,学完这个系列,应付日常开发绰绰有余。如果还想了解其他内容,扫面下方二维码告诉我,我会进一步完善这个系列的文章!