转自:

  https://blog.csdn.net/cp026la/article/details/86495196

前言:

开发中异常的处理必不可少,常用的就是 throw 和 try catch,这样一个项目到最后会出现很多冗余的代码,使用全局异常处理避免过多冗余代码。

全局异常处理:

1、pom 依赖(延续上一章代码):

<dependencies>
<!-- Spring Boot Web 依赖 -->
<!-- Web 依赖 - 包含了 spring-boot-starter-validation 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot Test 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- spring-boot整合mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- alibaba的druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.0</version>
</dependency>
<!--lombok依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
</dependency>
<!-- fastjson 依赖添加 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.31</version>
</dependency>
</dependencies>  

2、公共的结果类封装:
这里简单封装,实际根据自己业务需求去封装。

@Getter
@Setter
public class ApiResult {
// 响应业务状态
private Integer status;
// 响应消息
private String msg;
// 响应中的数据
private Object data;
public static ApiResult build(Integer status, String msg, Object data) {
return new ApiResult(status, msg, data);
}
public static ApiResult ok(Object data) {
return new ApiResult(data);
}
public static ApiResult ok() {
return new ApiResult(null);
}
public ApiResult() { }
public static ApiResult build(Integer status, String msg) {
return new ApiResult(status, msg, null);
}
public ApiResult(Integer status, String msg, Object data) {
this.status = status;
this.msg = msg;
this.data = data;
}
public ApiResult(Object data) {
this.status = 200;
this.msg = "OK";
this.data = data;
}
}

  

3、添加全局异常处理类(在入口函数下的包中新建):

/**
* 全局异常处理 Handler
* @ControllerAdvice 配置控制器通知
* annotations 属性: 指定我们需要拦截的注解,一个或多个(多个加到大括号中,逗号分隔)
*/
// @RestControllerAdvice = @ResponseBody + @ControllerAdvice
@RestControllerAdvice(annotations = {RestController.class})
@Slf4j
public class GlobalExceptionHandler {
/**
* 默认统一异常处理方法
* @ExceptionHandler 注解用来配置需要拦截的异常类型, 也可以是自定义异常
*/
@ExceptionHandler(Exception.class)
// 此处可以指定返回的状态码 和 返回 结果说明
// @ResponseStatus(reason = "exception",value = HttpStatus.BAD_REQUEST)
public Object runtimeExceptionHandler(Exception e) {
// 打印异常信息到控制台
e.printStackTrace();
log.error("请求出现异常,异常信息为: {}", e.getMessage());
// 使用公共的结果类封装返回结果, 这里我指定状态码为 400
return ApiResult.build(400, e.getMessage());
}
}  

4、异常测试类:

/**
* 异常处理测试 controller
*/
@RestController
@Slf4j
public class ExceptionController {
@RequestMapping(value = "/exception/{number}")
public ApiResult exception(@PathVariable int number) {
int res = 10 / number;
log.info(">>>>>结果number为: {}", res);
return ApiResult.ok();
}
}  

5、测试:
  5.1、请求接口:http://localhost:8080/exception/1 结果正常
  5.2、请求接口:http://localhost:8080/exception/0 出现除以 0 错误,全局异常处理起作用,返回指定结果集。

最新文章

  1. 占位符行为 PlaceHolderBehavior 的实现以及使用
  2. UWP学习记录7-设计和UI之控件和模式4
  3. OstrichNet 简易统计信息收集工具
  4. echo命令写shell
  5. 浅谈Java中的深拷贝和浅拷贝(转载)
  6. 初次使用C#中的yield
  7. Java基础之处理事件——添加菜单图标(Sketcher 8 with toolbar buttons and menu icons)
  8. 【leetcode❤python】 257. Binary Tree Paths
  9. WCF之多个终结点
  10. 500 OOPS: cannot change directory:/home/test
  11. 导入导出Excel的Java工具类ExcelUtil
  12. scrapy crawl rules设置
  13. Archive &amp; Backup 概念
  14. 安防工程商必须知道的PoE供电真相
  15. PHP并发之Swoole
  16. Vue 项目架构设计与工程化实践
  17. ERROR tool.ImportTool: Encountered IOException running import job: java.io.IOException: Cannot run program &quot;hive&quot;: error=2, No such file or directory
  18. UVA - 11624 Fire! bfs 地图与人一步一步先后搜/搜一次打表好了再搜一次
  19. hdu1080 DP(类最长公共子序列)
  20. idea 使用spring boot 搭建freemarker模板

热门文章

  1. python chrome
  2. Java基础00-抽象类20
  3. 如何让Spring Boot 的配置动起来?
  4. 【剑指offer】73.数组中出现次数超过一半的数字
  5. mysql常用sql语法
  6. SSM整合文件框架
  7. gos-log高性能大日志检索中台
  8. 用 5W1H 告诉你如何规划合理的测试策略
  9. 论文笔记:(CVPR2019)PointWeb: Enhancing Local Neighborhood Features for Point Cloud Processing
  10. Optional解决空指针