当前位置: 首页 > news >正文

Spring Boot全局异常

 Spring Boot全局异常

      Spring Boot全局异常处理是一种机制,用于处理应用程序中出现的所有未处理异常。当应用程序遇到未处理的异常时,全局异常处理机制将捕获该异常并返回一个可读的错误响应给客户端,以避免应用程序崩溃或返回不友好的错误信息给用户。全局异常处理可以帮助开发人员更好地跟踪和调试应用程序的异常情况,并提供更好的用户体验。在Spring Boot中,可以使用@ExceptionHandler注解和@ControllerAdvice注解来实现全局异常处理。

应用

   在 Spring Boot 应用程序中,实现全局异常处理是确保应用程序稳定性和用户友好的重要步骤。全局异常处理可以帮助捕捉和处理所有未被处理的异常,并返回一致且有用的错误响应。Spring Boot 提供了多种方式来实现全局异常处理,主要通过使用 `@ControllerAdvice` 和 `@ExceptionHandler` 注解。

以下是实现全局异常处理的步骤和示例:

 1. **使用 `@ControllerAdvice` 和 `@ExceptionHandler`**

#### a. **创建全局异常处理类**

`@ControllerAdvice` 注解用于定义一个全局的异常处理器,该类可以捕捉所有控制器抛出的异常。`@ExceptionHandler` 注解用于指定具体的异常类型及其处理方法。


import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.ResponseBody;@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(ResourceNotFoundException.class)@ResponseStatus(HttpStatus.NOT_FOUND)@ResponseBodypublic ErrorResponse handleResourceNotFoundException(ResourceNotFoundException ex) {return new ErrorResponse(HttpStatus.NOT_FOUND.value(), ex.getMessage());}@ExceptionHandler(IllegalArgumentException.class)@ResponseStatus(HttpStatus.BAD_REQUEST)@ResponseBodypublic ErrorResponse handleIllegalArgumentException(IllegalArgumentException ex) {return new ErrorResponse(HttpStatus.BAD_REQUEST.value(), ex.getMessage());}@ExceptionHandler(Exception.class)@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)@ResponseBodypublic ErrorResponse handleGlobalException(Exception ex) {return new ErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(), "An unexpected error occurred");}
}

#### b. **创建错误响应类**

定义一个通用的错误响应类,用于返回给客户端的错误信息。


public class ErrorResponse {private int status;private String message;public ErrorResponse(int status, String message) {this.status = status;this.message = message;}// Getters and setters
}

2. **自定义异常**

你可以创建自定义异常类以表示特定类型的错误:


public class ResourceNotFoundException extends RuntimeException {public ResourceNotFoundException(String message) {super(message);}
}

3. **使用 `@ResponseStatus` 注解**

除了在 `@ExceptionHandler` 中设置状态码外,你还可以直接在自定义异常类上使用 `@ResponseStatus` 注解来设置响应状态码:


import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;@ResponseStatus(HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {public ResourceNotFoundException(String message) {super(message);}
}

 4. **使用 `ResponseEntityExceptionHandler`**

对于更复杂的异常处理需求,可以扩展 `ResponseEntityExceptionHandler`,这是 Spring 提供的用于处理标准 Spring MVC 异常的基类。


import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;@ControllerAdvice
public class CustomExceptionHandler extends ResponseEntityExceptionHandler {@ExceptionHandler(ResourceNotFoundException.class)public ResponseEntity<Object> handleResourceNotFoundException(ResourceNotFoundException ex, WebRequest request) {ErrorResponse errorResponse = new ErrorResponse(HttpStatus.NOT_FOUND.value(), ex.getMessage());return new ResponseEntity<>(errorResponse, HttpStatus.NOT_FOUND);}@ExceptionHandler(Exception.class)public ResponseEntity<Object> handleGlobalException(Exception ex, WebRequest request) {ErrorResponse errorResponse = new ErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(), "An unexpected error occurred");return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);}
}

 5. **异常处理的最佳实践**

- **记录异常**:确保在处理异常时记录异常信息,以便后续分析和调试。可以使用日志框架(如 Logback 或 Log4j2)记录详细的错误日志。
- **返回一致的错误响应**:确保错误响应具有一致的结构,以便客户端可以一致地处理错误。
- **考虑客户端体验**:提供清晰且用户友好的错误消息,不暴露内部实现细节。

 6. **示例项目结构**

项目结构可以如下:


src/main/java└── com└── example├── controller│   └── MyController.java├── exception│   ├── GlobalExceptionHandler.java│   ├── ResourceNotFoundException.java│   └── ErrorResponse.java└── Application.java

- **`MyController.java`**:包含业务逻辑的控制器。
- **`GlobalExceptionHandler.java`**:处理全局异常。
- **`ResourceNotFoundException.java`**:自定义异常类。
- **`ErrorResponse.java`**:错误响应类。
- **`Application.java`**:应用程序主类。

 总结

在 Spring Boot 中实现全局异常处理可以帮助你统一管理异常响应,提供一致的错误信息,并提高应用程序的可维护性。通过使用 `@ControllerAdvice` 和 `@ExceptionHandler` 注解、创建自定义异常和错误响应类,你可以高效地处理应用程序中的异常情况。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SQL server 同环比计算模板
  • HDU动态规划——1114.Piggy-Bank,1121.Complete the Sequence,1158.Employment Planning
  • 音视频开发继续学习
  • 【Python】线性规划模型(笔记)
  • 编译aws并访问minio
  • Spring boot 使用 jSerialComm 对串口使用发送信息并接收
  • 【香菇带你学Mysql】Linux下Mysql8使用二进制安装包安装教程【建议收藏】
  • 案例分享—国外深色UI界面设计赏析
  • 使用 C++ 实现简单的插件系统
  • 程序员的最爱,FRP实现无公网IP的内网穿透,搭建远程服务:http、ssh、samba,基于最新FRP0.59.0版本
  • 【网络协议】网络劫持 - ARP/DNS欺骗篇
  • Windows11 WSL2 Ubuntu编译安装perf工具
  • 【C++深度探索】哈希表介绍与实现
  • 并查集-应用方向以及衍生汇总+代码实现(c++)-学习一个数据结构就会做三类大题!
  • 【QT常用技术讲解】多线程处理+全局变量处理异步事件并获取多个线程返回的结果
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • idea + plantuml 画流程图
  • Javascript编码规范
  • java取消线程实例
  • Linux CTF 逆向入门
  • Phpstorm怎样批量删除空行?
  • php的插入排序,通过双层for循环
  • v-if和v-for连用出现的问题
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • vue总结
  • 阿里云前端周刊 - 第 26 期
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 聊一聊前端的监控
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 自制字幕遮挡器
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • ​secrets --- 生成管理密码的安全随机数​
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • ${ }的特别功能
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • $NOIp2018$劝退记
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (七)理解angular中的module和injector,即依赖注入
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (转)Mysql的优化设置
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • *p++,*(p++),*++p,(*p)++区别?
  • *算法训练(leetcode)第四十天 | 647. 回文子串、516. 最长回文子序列
  • .NET 8 跨平台高性能边缘采集网关
  • .Net Core 生成管理员权限的应用程序
  • .Net Core中的内存缓存实现——Redis及MemoryCache(2个可选)方案的实现
  • .NET Micro Framework初体验