在开发中,咱们常常会使用try/catch块
来捕获异常进行处理,若是有些代码中忘记捕获异常或者不可见的一些异常出现,就会响应给前端一些不友好的提示,这时候咱们可使用全局异常处理。这样就不用在代码中写那些烦人的try/catch块了
,代码的可读性也会提升。前端
SpringBoot提供的的注解@ControllerAdvice
表示开启全局异常捕获,在自定义的异常方法上使用ExceptionHandler
来进行统一处理。java
下面一块儿看看如何优雅的处理全局异常!git
@Getter public enum CodeEnum { SUCCESS(0,"请求成功"), ERROR(500,"未知异常"), ERROR_EMPTY_RESULT(1001,"查询结果为空"), ERROR_INCOMPLETE_RESULT(1002,"请求参数不全"); private int code; private String message; CodeEnum(int code,String message){ this.code = code; this.message = message; } }
@Slf4j @Data public class R<T> implements Serializable { private static final long serialVersionUID = 572235155491705152L; /** * 响应的状态码 */ private int code; /*** * 响应的信息 */ private String message; /** * 响应数据 */ private T data; /** * 放入响应码并返回 * @param code * @param msg * @return */ public R fillCode(int code,String msg){ this.code = code; this.message = msg; return this; } /** * 放入响应码并返回 * @param codeEnum * @return */ public R fillCode(CodeEnum codeEnum){ this.code = codeEnum.getCode(); this.message = codeEnum.getMessage(); return this; } /** * 放入数据并响应成功状态 * @param data * @return */ public R fillData(T data){ this.code = CodeEnum.SUCCESS.getCode(); this.message = CodeEnum.SUCCESS.getMessage(); this.data = data; return this; } }
根据业务需求自定义异常,在本文中我定义了两个异常,分别用做响应结果为空时处理和请求参数错误时处理。github
@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格式的数据。spring
@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; } }
@RestController public class TestController { @GetMapping("getString") public R getString(String name){ if(StringUtils.isEmpty(name)){ throw new RequestParamException(1002,"请求参数name为空"); }else if ("Java旅途".equals(name)) { // 这里没有查询操做,当请求参数是Java旅途的时候,模拟成查询结果为空 throw new EmptyResutlException(1001,"查询结果为空"); } // 这里模拟一下除自定义异常外的其余两种异常 int i = 0; i = 5/i; return new R().fillData(name); } }
在实际开发中能够自定义响应状态码的枚举类和自定义异常以知足需求。json
此是spring-boot-route系列的第四篇文章,这个系列的文章都比较简单,主要目的就是为了帮助初次接触Spring Boot 的同窗有一个系统的认识。本文已收录至个人github,欢迎各位小伙伴star
!微信
github:https://github.com/binzh303/spring-boot-routeapp
若是以为文章不错,欢迎关注、点赞、收藏,大家的支持是我创做的动力,感谢你们。spring-boot
若是文章写的有问题,请不要吝啬,欢迎留言指出,我会及时核查修改。学习
若是你还想更加深刻的了解我,能够微信搜索「Java旅途」进行关注。回复「1024」便可得到学习视频及精美电子书。天天7:30准时推送技术文章,让你的上班路不在孤独,并且每个月还有送书活动,助你提高硬实力!