前言

在spring项目中,优雅处理异常,好处是可以将系统产生的全部异常统一捕获处理,自定义的异常也由全局异常来捕获,如果涉及到validator参数校验器使用全局异常捕获也是较为方便。

相关代码:

GlobalExceptionHandler类:

  1. @Slf4j
  2. @RestControllerAdvice
  3. public class GlobalExceptionHandler {
  4. /********************************
  5. * @function : 自定义从捕捉
  6. * @parameter : [e:CustomException | 自定义异常]
  7. * @date : 2023/12/5 11:47
  8. ********************************/
  9. @ExceptionHandler(value = CustomException.class)
  10. public AjaxResult customExceptionHandler(HttpServletRequest request, CustomException e) {
  11. log.error("业务异常,url:{}, 异常内容:{}" ,request.getRequestURI(), e);
  12. return new AjaxResult(e.getCode() , e.getMessage(), null);
  13. }
  14. /********************************
  15. * @function : 空指针异常捕捉
  16. * @parameter : [e:Exception | 异常]
  17. * @date : 2023/12/5 11:47
  18. ********************************/
  19. @ExceptionHandler(value = Exception.class)
  20. public AjaxResult exceptionHandler(HttpServletRequest request, Exception e) {
  21. log.error("服务器内部异常异常,url:{}, 异常内容:{}" ,request.getRequestURI(), e);
  22. return new AjaxResult(500 , e.getMessage(), null);
  23. }
  24. }

自定义异常CustomException类:

  1. @Slf4j
  2. @Data
  3. public class CustomException extends RuntimeException{
  4. //错误码
  5. private int code;
  6. //错误信息
  7. private String message;
  8. public CustomException() {
  9. super();
  10. }
  11. public CustomException(ResultCodeEnum resultCodeEnum) {
  12. super(String.valueOf(resultCodeEnum.getCode()));
  13. this.code = resultCodeEnum.getCode();
  14. this.message = resultCodeEnum.getMessage();
  15. }
  16. }

通用返回类:AjaxResult

  1. @Data
  2. public class AjaxResult extends HashMap<String, Object> {
  3. // 状态码
  4. private static final String CODE_TAG = "code";
  5. // 返回消息
  6. private static final String MSG_TAG = "message";
  7. // 数据对象
  8. private static final String DATA_TAG = "data";
  9. public AjaxResult(int code, String message, Object data)
  10. {
  11. super.put(CODE_TAG, code);
  12. super.put(MSG_TAG, message);
  13. if (data != null)
  14. {
  15. super.put(DATA_TAG, data);
  16. }
  17. }
  18. /********************************
  19. * @method : success
  20. * @function : 返回成功消息(重载)
  21. * @parameter :
  22. * @return : AjaxResult
  23. ********************************/
  24. public static AjaxResult success(){
  25. return new AjaxResult(ResultCodeEnum.SUCCESS.getCode(), ResultCodeEnum.SUCCESS.getMessage(), null);
  26. }
  27. /********************************
  28. * @method : success
  29. * @function : 返回成功消息(重载)
  30. * @parameter : message : String | 返回消息
  31. * @return : AjaxResult
  32. ********************************/
  33. public static AjaxResult success(String message){
  34. return new AjaxResult(ResultCodeEnum.SUCCESS.getCode(), message, null);
  35. }
  36. /********************************
  37. * @method : success
  38. * @function : 返回成功消息(重载)
  39. * @parameter : data : Object | 数据对象
  40. * @return : AjaxResult
  41. ********************************/
  42. public static AjaxResult success(Object data){
  43. return new AjaxResult(ResultCodeEnum.SUCCESS.getCode(), ResultCodeEnum.SUCCESS.getMessage(), data);
  44. }
  45. /********************************
  46. * @method : success
  47. * @function : 返回成功消息(重载)
  48. * @parameter : message : String | 返回消息
  49. * @parameter : data : Object | 数据对象
  50. * @return : AjaxResult
  51. ********************************/
  52. public static AjaxResult success(String message, Object data){
  53. return new AjaxResult(ResultCodeEnum.SUCCESS.getCode(), message, data);
  54. }
  55. /********************************
  56. * @method : failed
  57. * @function : 返回失败消息(重载)
  58. * @parameter :
  59. * @return : AjaxResult
  60. ********************************/
  61. public static AjaxResult failed(){
  62. return new AjaxResult(ResultCodeEnum.FAILED.getCode(), ResultCodeEnum.FAILED.getMessage(), null);
  63. }
  64. /********************************
  65. * @method : failed
  66. * @function : 返回失败消息(重载)
  67. * @parameter : message : String | 返回消息
  68. * @return : AjaxResult
  69. ********************************/
  70. public static AjaxResult failed(String message){
  71. return new AjaxResult(ResultCodeEnum.FAILED.getCode(), message, null);
  72. }
  73. /********************************
  74. * @method : failed
  75. * @function : 返回失败消息(重载)
  76. * @parameter : resultCodeEnum : ResultCodeEnum | 失败枚举类型
  77. * @return : AjaxResult
  78. ********************************/
  79. public static AjaxResult failed(ResultCodeEnum resultCodeEnum){
  80. return new AjaxResult(resultCodeEnum.getCode(), resultCodeEnum.getMessage(), null);
  81. }
  82. /********************************
  83. * @method : failed
  84. * @function : 返回失败消息(重载)
  85. * @parameter : message : String | 返回消息
  86. * @parameter : data : Object | 数据对象
  87. * @return : AjaxResult
  88. ********************************/
  89. public static AjaxResult failed(String message, Object data){
  90. return new AjaxResult(ResultCodeEnum.FAILED.getCode(), message, data);
  91. }
  92. /********************************
  93. * @method : failed
  94. * @function : 返回失败消息(重载)
  95. * @parameter : resultCodeEnum : ResultCodeEnum | 失败枚举类型
  96. * @parameter : data : Object | 数据对象
  97. * @return : AjaxResult
  98. ********************************/
  99. public static AjaxResult failed(ResultCodeEnum resultCodeEnum, Object data){
  100. return new AjaxResult(resultCodeEnum.getCode(), resultCodeEnum.getMessage(), data);
  101. }
  102. }

枚举类ResultCodeEnum:

  1. public enum ResultCodeEnum {
  2. // 10??? 通用
  3. SUCCESS(10000,"请求成功"),
  4. FAILED(10008, "请求失败"),
  5. FAILED_PARAM_ERROR(10009, "参数错误"),
  6. ...
  7. private Integer code;
  8. private String message;
  9. ResultCodeEnum(Integer code, String message) {
  10. this.code = code;
  11. this.message = message;
  12. }
  13. public int getCode(){
  14. return code;
  15. }
  16. public String getMessage(){
  17. return message;
  18. }
  19. }

使用:

在controller里面判断值是否异常,如果异常则直接抛出异常不进行执行,终止当前的流程,在service层也可以这样处理。


  1. public AjaxResult getUserInfo(@RequestParam(value = "userId") Integer userId) {
  2. if userId == 0) {
  3. throw new CustomException(ResultCodeEnum.NOT_EXIST_USER_ERROR);
  4. }
  5. ...
  6. }

再者是一些数值上的错误,比如除0,这种情况会被全局异常捕获,并返回相应的错误给到前端


  1. @GetMapping("/test")
  2. public AjaxResult test(){
  3. int i = 60/0;
  4. return AjaxResult.success();
  5. }

springboot下添加全局异常处理和自定义异常处理的更多相关文章

  1. SpringBoot系列教程web篇之自定义异常处理HandlerExceptionResolver

    关于Web应用的全局异常处理,上一篇介绍了ControllerAdvice结合@ExceptionHandler的方式来实现web应用的全局异常管理: 本篇博文则带来另外一种并不常见的使用方式,通过实 ...

  2. 【SpringBoot】单元测试进阶实战、自定义异常处理、t部署war项目到tomcat9和启动原理讲解

    ========================4.Springboot2.0单元测试进阶实战和自定义异常处理 ============================== 1.@SpringBoot ...

  3. Java中的异常处理(三) - 自定义异常处理

    1.异常处理类 package second; public class MyException extends Exception { MyException (){ } MyException ( ...

  4. SpringBoot优雅的全局异常处理

    前言 本篇文章主要介绍的是SpringBoot项目进行全局异常的处理. SpringBoot全局异常准备 说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程代码. 开发准备 环境要求 JD ...

  5. SpringBoot中的全局异常处理

    SpringBoot中的全局异常处理 本篇要点 介绍SpringBoot默认的异常处理机制. 如何定义错误页面. 如何自定义异常数据. 如何自定义视图解析. 介绍@ControllerAdvice注解 ...

  6. 七天学会ASP.NET MVC (六)——线程问题、异常处理、自定义URL

    本节又带了一些常用的,却很难理解的问题,本节从文件上传功能的实现引出了线程使用,介绍了线程饥饿的解决方法,异常处理方法,了解RouteTable自定义路径 . 系列文章 七天学会ASP.NET MVC ...

  7. 线程问题、异常处理、自定义URL

    线程问题.异常处理.自定义URL   本节又带了一些常用的,却很难理解的问题,本节从文件上传功能的实现引出了线程使用,介绍了线程饥饿的解决方法,异常处理方法,了解RouteTable自定义路径 . 系 ...

  8. WebAPI调用笔记 ASP.NET CORE 学习之自定义异常处理 MySQL数据库查询优化建议 .NET操作XML文件之泛型集合的序列化与反序列化 Asp.Net Core 轻松学-多线程之Task快速上手 Asp.Net Core 轻松学-多线程之Task(补充)

    WebAPI调用笔记   前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于 ...

  9. SpringBoot 2.x (5):异常处理与部署WAR项目

    异常处理: SpringBoot的异常处理是不友好的,前端只会显示最基本的错误名称 后端控制台会报出具体的错误,那么我们如何告知前端具体的错误信息呢? 1:对全局异常进行处理 一个测试的Control ...

  10. Spring Cloud实战 | 第九篇:Spring Cloud整合Spring Security OAuth2认证服务器统一认证自定义异常处理

    本文完整代码下载点击 一. 前言 相信了解过我或者看过我之前的系列文章应该多少知道点我写这些文章包括创建 有来商城youlai-mall 这个项目的目的,想给那些真的想提升自己或者迷茫的人(包括自己- ...

随机推荐

  1. Hugging News #0814: Llama 2 学习资源大汇总 🦙

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  2. mybatis系列: 简介以及使用

    目录 一.简介 二.简单使用 一.简介 MyBatis本质上就是对JDBC的封装,通过MyBatis完成CRUD. MyBatis在三层架构中负责持久层的,属于持久层框架. MyBatis的发展历程: ...

  3. SRC赏金猎人—笔记一

    以下是我如何将 webshell 上传到一个旧目标中, 这是使用谷歌dorks,Js检查和文件上传过滤器绕过. 过程 1.我随机选择了一个范围很大的目标开始 2.我启动了自动化脚本来发现使用的技术.d ...

  4. 深入理解MySQL:数据类型、查询优化、索引、事务处理和数据备份与恢复

    摘要: MySQL 是一种常用的关系型数据库管理系统,对于开发者和数据库管理员来说,掌握 MySQL 的关键概念和最佳实践非常重要.本文将围绕 MySQL 的数据类型.查询优化.索引.事务处理以及数据 ...

  5. WPF 入门笔记 - 08 - 动画

    感谢大家对上篇博文的支持 回到正题,今天和大家分享下学习动画过程中的内容.动画对我来讲还是蛮新鲜的,大家知道在接触WPF之前我只用过Winform,而Winform中并没有动画的概念,当想要实现某些& ...

  6. Programming abstractions in C阅读笔记:p139-p143

    <Programming Abstractions In C>学习第55天,p139-p140,总结如下: 一.技术总结 1.文件I/O操作 文件I/O操作可以分为一下这些步骤: (1)声 ...

  7. 正则表达式快速入门二 :python re module 常用API介绍

    python regex module re 使用 reference regex module in python import re re.search re.search(regex, subj ...

  8. Record -「Tricks」记录

    曼哈顿距离 \(\text{dist}(A,B)=|x_{A}-x_{B}|+|y_{A}-y_{B}|\) 可以拆成 \(\max\{x_{A}-x_{B}+y_{A}-y_{B},x_{A}-x_ ...

  9. C++算法之旅、08 基础篇 | 质数、约数

    质数 在>1的整数中,如果只包含1和本身这两个约数,就被称为质数(素数) 866 试除法判定 866. 试除法判定质数 - AcWing题库 \(O(n)\) bool isprime(int ...

  10. 分布式与微服务——Iaas,Paas和Saas、单体应用和缺点、微服务概念、传统 分布式 SOA 架构与微服务架构的区别、微服务实战、什么是RPC、CAP定理和BASE理论、唯一ID生成、实现分布式

    文章目录 1-什么是Iaas,Paas和Saas 一 IaaS基础设施服务 二 paas平台即服务 三saas软件即服务 四 总结 2-单体应用和缺点 一 单体应用 二 单体应用的缺陷 3-微服务概念 ...