spring-boot-route(四)全局异常处理
在开发中,我们经常会使用try/catch块来捕获异常进行处理,如果有些代码中忘记捕获异常或者不可见的一些异常出现,就会响应给前端一些不友好的提示,这时候我们可以使用全局异常处理。这样就不用在代码中写那些烦人的try/catch块了,代码的可读性也会提高。
SpringBoot提供的的注解@ControllerAdvice表示开启全局异常捕获,在自定义的异常方法上使用ExceptionHandler来进行统一处理。
下面一起看看如何优雅的处理全局异常!
一 定义响应状态码及信息的枚举类
@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;
}
}
三 自定义两个异常
根据业务需求自定义异常,在本文中我定义了两个异常,分别用作响应结果为空时处理和请求参数错误时处理。
@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;
}
}
五 自定义接口测试异常
@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);
}
}
在实际开发中可以自定义响应状态码的枚举类和自定义异常以满足需求。
此是spring-boot-route系列的第四篇文章,这个系列的文章都比较简单,主要目的就是为了帮助初次接触Spring Boot 的同学有一个系统的认识。本文已收录至我的github,欢迎各位小伙伴star!
github:https://github.com/binzh303/spring-boot-route
点关注、不迷路
如果觉得文章不错,欢迎关注、点赞、收藏,你们的支持是我创作的动力,感谢大家。
如果文章写的有问题,请不要吝啬,欢迎留言指出,我会及时核查修改。
如果你还想更加深入的了解我,可以微信搜索「Java旅途」进行关注。回复「1024」即可获得学习视频及精美电子书。每天7:30准时推送技术文章,让你的上班路不在孤独,而且每月还有送书活动,助你提升硬实力!
spring-boot-route(四)全局异常处理的更多相关文章
- Spring Boot2 系列教程(十三)Spring Boot 中的全局异常处理
在 Spring Boot 项目中 ,异常统一处理,可以使用 Spring 中 @ControllerAdvice 来统一处理,也可以自己来定义异常处理方案.Spring Boot 中,对异常的处理有 ...
- spring boot / cloud (四) 自定义线程池以及异步处理@Async
spring boot / cloud (四) 自定义线程池以及异步处理@Async 前言 什么是线程池? 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线 ...
- Spring Boot入门(四):开发Web Api接口常用注解总结
本系列博客记录自己学习Spring Boot的历程,如帮助到你,不胜荣幸,如有错误,欢迎指正! 在程序员的日常工作中,Web开发应该是占比很重的一部分,至少我工作以来,开发的系统基本都是Web端访问的 ...
- Spring Boot 2 (四):使用 Docker 部署 Spring Boot
Spring Boot 2 (四):使用 Docker 部署 Spring Boot Docker 技术发展为微服务落地提供了更加便利的环境,使用 Docker 部署 Spring Boot 其实非常 ...
- Spring Boot(十四):spring boot整合shiro-登录认证和权限管理
Spring Boot(十四):spring boot整合shiro-登录认证和权限管理 使用Spring Boot集成Apache Shiro.安全应该是互联网公司的一道生命线,几乎任何的公司都会涉 ...
- Spring Cloud Gateway的全局异常处理
Spring Cloud Gateway中的全局异常处理不能直接用@ControllerAdvice来处理,通过跟踪异常信息的抛出,找到对应的源码,自定义一些处理逻辑来符合业务的需求. 网关都是给接口 ...
- Spring Boot @ControllerAdvice 处理全局异常,返回固定格式Json
需求 在构建RestFul的今天,我们一般会限定好返回数据的格式比如: { "code": 0, "data": {}, "msg": ...
- Spring Boot (四)模板引擎Thymeleaf集成
一.Thymeleaf介绍 Thymeleaf是一种Java XML / XHTML / HTML5模板引擎,可以在Web和非Web环境中使用.它更适合在基于MVC的Web应用程序的视图层提供XHTM ...
- Spring Boot 中关于自定义异常处理的套路!
在 Spring Boot 项目中 ,异常统一处理,可以使用 Spring 中 @ControllerAdvice 来统一处理,也可以自己来定义异常处理方案.Spring Boot 中,对异常的处理有 ...
- 转:Spring Boot应用中的异常处理
引自:https://www.cnblogs.com/yangfanexp/p/7616570.html 楼主前几天写了一篇“Java子线程中的异常处理(通用)”文章,介绍了在多线程环境下3种通用的异 ...
随机推荐
- JVM系列.历史上出现过的Java虚拟机
HotSpot绝对是当今商用虚拟机的王者,但是在Java历史上出现过很多Java虚拟机,这篇文章就来整理下历史上出现过的Java虚拟机以及他们的特性. Sun Classic Sun Classic虚 ...
- Qt QDialog添加最大化和最小化按钮
Qt QDialog添加最大化和最小化按钮(转载) QDialog窗体右上角默认是没有最小化和最大化按钮的. 1.效果 2.上代码 1 // 设置窗体最大化和最小化 2 Qt::WindowFlags ...
- laravel kernel解析过程
laravel kernel解析过程 前面的两篇laravel文章过后,可以在bootstrap/app.php中拿到$app这个实例, app.php中 接下来通过singleton方法绑定了三个闭 ...
- Labview学习之路(一)程序框图中的修饰
很多小伙伴知道在前面板有很多修饰符,比如上凸框,加粗下凹框等等,但是其实在程序框图中也是有修饰符的,他的位置比较隐蔽,并且修饰符很少,所以很多人基本没有用过.现在就给大家介绍一些这些程序框图种的修饰. ...
- org.xml.sax.SAXParseException: The processing instruction target matching "[xX][mM][lL]" is not allowed(转)
xml文件不能被正确解析/The processing instruction target matching "[xX][mM][lL]" is not allowed. The ...
- HDU多校-1004-Vacation(思维)
Tom and Jerry are going on a vacation. They are now driving on a one-way road and several cars are i ...
- 石子合并(区间dp典型例题)
Description 有n堆石子排成一行,每次选择相邻的两堆石子,将其合并为一堆,记录该次合并的得分为两堆石子个数之和.已知每堆石子的石子个数,求当所有石子合并为一堆时,最小的总得分. Input ...
- or2?Scum!(周期性求解)
链接:https://ac.nowcoder.com/acm/contest/316/E 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言2621 ...
- TinkPHP5.1开发注意事项
1.新下载的框架文件,开发前先开启调试配置 config目录下app.php文件 // 应用调试模式 'app_debug' => true, 2.每新建一个方法,都要 ...
- ZT:15 个你非了解不可的 Linux 特殊字符
https://os.51cto.com/art/202003/611595.htm 不知道大家接触 Linux 系统有多久了,可曾了解过 Linux 中有哪些特殊的字符呢?其实啊,那些特殊字符都大有 ...