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种通用的异 ...
随机推荐
- day03 每日一行
day03 每日一行 问题描述 用列表解释式 .生成器表达式实现 字典列表为: [{'first': 'john', 'last': 'smith', 'email': 'jsmith@exsampl ...
- vue中页面卡顿,使用懒加载
为给客户更好的客户体验,首屏组件加载速度更快一些,解决白屏问题. 懒加载简单来说就是延迟加载或按需加载,即在需要的时候的时候进行加载. 常用的懒加载方式有两种:即使用vue异步组件 和 ES中的imp ...
- C#还原对图像做的修改
在C#程序中对图像进行处理,有的时候需要将处理后的图像还原,便于观察两者之间的区别,避免重新运行程序造成的麻烦.我是将之前写的Tab页中打开的图像进行还原,将原始图像数据保存在数据流中,然后从数据流中 ...
- Transform与Vector3 的API
Transform.InverseTransformDirection(Vector3 direction) Vector3.ProjectOnPlane(Vector3 vector, Vector ...
- HTTPS建立过程
由于HTTPS建立过程经常忘记,固记录 HTTPS建立流程 客户端发起SSL连接 服务端发送证书(证书中包含了服务端公钥) 客户端根据已有证书判断是否是可信任的(客户端决定是否继续) 服务端要求客户端 ...
- Python 零基础快速入门!
“人生苦短,我学python”是编程届的名言.用python写小脚本的便捷性,让很多其他语言的学习者把python当作辅助语言.拥有了某一个语言的功底,再来学习另外一种语言应该是十分快速的.编程理念都 ...
- 转载:MySQL万字总结篇
转载自:https://database.51cto.com/art/202001/609409.htm 开局一张图 这张图是重点!!!咱要先对 MySQL 有一个宏观的了解,知道他的执行流程. 一条 ...
- Tomcat三实例cluster多播方案共享session再配置
昨天已经将两实例cluster多播方案共享Session配置成功,其中的关键就在于server.xml中,engine->channel->receiver节点中address得写成自己的 ...
- MySQL互联网业务使用建议
一.基础规范 表存储引擎必须使用InnoDB 表字符集默认使用utf8,必要时候使用utf8mb4 解读: (1)通用,无乱码风险,汉字3字节,英文1字节 (2)utf8mb4是utf8的超集,有存储 ...
- Java判断一个字符串是否是回文
package com.spring.test; /** * 判断字符串是否为回文 * * @author liuwenlong * @create 2020-08-31 11:33:04 */ @S ...