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种通用的异 ...
随机推荐
- Vue基础(三)---- 组件化开发
基本结构: ◆1.组件化开发思想 ◆2.组件注册 ◆3.Vue调试工具用法 ◆4.组件间数据交互 ◆5.组件插槽 ◆6.基于组件的案例 ◆1.组件化开发思想 优点: 提高开发效率 方便重复使用 简 ...
- py_正则表达式练习
正则表达式: #正则表达式 #键盘数字6上的符号,^表示行的开始,$ 表示行的结束 #test = "tm queal Tomorrow Moon" ''' ^tm #匹配tm开头 ...
- 递归 & 分治算法深度理解
首先简单阐述一下递归,分治算法,动态规划,贪心算法这几个东西的区别和联系,心里有个印象就好. 递归是一种编程技巧,一种解决问题的思维方式:分治算法和动态规划很大程度上是递归思想基础上的(虽然实现动态规 ...
- 【Webpack】NodeJS + Webpack
目的:想要通过npm命令按照我们的规则生成静态资源(webpack4以后还能做到很多性能优化的配置,我所知道的只有css.js分包,以达到资源快速加载快速呈现的效果). 一.安装webpack npm ...
- 剑指 Offer 55 - I. 二叉树的深度
题目描述 输入一棵二叉树的根节点,求该树的深度.从根节点到叶节点依次经过的节点(含根.叶节点)形成树的一条路径,最长路径的长度为树的深度. 例如: 给定二叉树 [3,9,20,null,null,15 ...
- Mysql优化概述及其压力测试工具
衡量指标 TPS:Transactions Per Second (每秒传输的事物处理个数) ,这是指服务器每秒处理的事物数,支持事物的存储引擎如Innodb等特有的一个性能指标; QPS:Queri ...
- 转载 深入理解Nginx及使用Nginx实现负载均衡
转载:https://developer.51cto.com/art/202001/609322.htm 正向代理是代理客户端,也就是客户端能真正接触到的,比如访问外网时需要使用VPN软件,在这个软件 ...
- python中使用cookie进行模拟登录
背景:使用cookie模拟登录豆瓣->我的豆瓣网页 [准备工作] 1.通过Fiddler抓取“我的豆瓣”url: 2.通过Fiddler抓取“我的豆瓣”cookie值. import urlli ...
- JS中条件判断语句
用pycharm敲代码时,在.js文件中敲,敲完之后复制代码到浏览器的console中去回车执行 1.if( ){} 2.switch(a){} 3.for循环 循环列表 循环字典 循环字符串 另外 ...
- HTML全局属性(global attribute)有哪些(包含H5)
1.accesskey:提供了为当前元素生成键盘快捷键的提示.这个属性由空格分隔的字符列表组成.浏览器应该使用在计算机键盘布局上存在的第一个. 2.autocapitalize:控制用户的文本输入是否 ...