给我一个全局异常处理,错误返回common里面的result
时间: 2025-06-08 21:42:14 浏览: 43
<think>好的,我现在需要帮用户解决一个关于全局异常处理的问题。用户之前已经提过一个ArithmeticException的问题,现在他们想要一个全局异常处理,并且错误返回使用common包里的Result类。首先,我需要理解用户的需求:他们希望统一处理应用中的异常,并以特定的Result格式返回错误信息。
首先,我应该回忆一下Spring Boot中的全局异常处理机制。通常,这是通过@ControllerAdvice和@ExceptionHandler注解来实现的。用户提到要返回common包里的Result,这说明他们有一个自定义的响应类,可能包含code、message、data等字段。
接下来,我需要确定用户可能需要处理哪些异常。常见的包括自定义业务异常、运行时异常(如空指针、算术异常)、以及Spring MVC相关的异常(如请求参数缺失或类型错误)。用户可能希望不同的异常返回不同的错误码和消息,但都统一使用Result格式。
然后,我需要考虑如何结构化解答。首先,创建一个全局异常处理类,用@ControllerAdvice标记。然后,为不同的异常类型编写处理方法,每个方法使用@ExceptionHandler指定处理的异常类,并返回ResponseEntity<Result>或者直接返回Result对象,根据用户项目中的实际情况调整。例如,处理自定义业务异常时,可能需要从异常中获取错误码和消息,填充到Result中。
另外,用户可能需要处理未预料到的其他异常,所以需要有一个兜底的异常处理,比如处理Exception.class,并返回系统错误的信息。同时,要注意日志记录,方便后续排查问题。
还需要考虑HTTP状态码的设置。例如,业务异常可能返回400 Bad Request,而系统内部错误则返回500 Internal Server Error。用户可能希望这些状态码和Result中的code字段对应起来,或者根据项目规范来设定。
假设用户的Result类结构如下:
```java
public class Result<T> {
private int code;
private String message;
private T data;
// 构造方法和getter/setter省略
}
```
那么,每个异常处理方法需要构建对应的Result对象,并设置合适的code和message。例如,自定义的BusinessException可能包含code和message属性,处理时直接取出;对于其他异常,可以定义默认的code,如500,message为系统繁忙。
同时,需要提醒用户在实际使用时,根据项目需求调整错误码和消息,可能还需要处理参数验证异常,比如使用@Validated时的MethodArgumentNotValidException,这时候需要提取具体的字段错误信息。
最后,给出示例代码时,要确保代码的正确性,比如正确的导入包,处理不同的异常类型,以及返回Result的实例。此外,可能需要提到如何自定义异常类,如BusinessException,并建议用户根据实际情况扩展其他异常处理。
总结步骤:
1. 创建全局异常处理类,使用@ControllerAdvice。
2. 定义处理不同异常的方法,使用@ExceptionHandler。
3. 在处理方法中构造Result对象,填充错误信息。
4. 处理常见的异常类型,包括自定义异常、Spring MVC异常、其他异常等。
5. 记录异常日志,方便调试。
6. 返回统一的Result结构,确保前端或客户端能够解析。
可能还需要提醒用户确保Result类在common包中的正确路径,以及在项目中已经正确配置了相关的依赖和组件扫描。此外,测试全局异常处理是否生效,可以通过故意抛出异常来验证返回的Result是否符合预期。</think>以下是基于 **Spring Boot** 的全局异常处理实现方案,统一返回 `common` 包中的 `Result` 对象:
---
### 1. 定义通用响应类 `Result`(假设已存在)
```java
package com.example.common;
public class Result<T> {
private int code; // 状态码(如200成功,500错误)
private String msg; // 提示信息
private T data; // 返回数据
// 成功静态方法
public static <T> Result<T> success(T data) {
Result<T> result = new Result<>();
result.setCode(200);
result.setMsg("成功");
result.setData(data);
return result;
}
// 错误静态方法
public static <T> Result<T> error(int code, String msg) {
Result<T> result = new Result<>();
result.setCode(code);
result.setMsg(msg);
return result;
}
// Getter/Setter省略
}
```
---
### 2. 创建全局异常处理器 `GlobalExceptionHandler`
```java
package com.example.handler;
import com.example.common.Result;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.http.ResponseEntity;
@RestControllerAdvice
public class GlobalExceptionHandler {
// 处理自定义业务异常(需提前定义)
@ExceptionHandler(BusinessException.class)
public ResponseEntity<Result<?>> handleBusinessException(BusinessException e) {
return ResponseEntity.ok(Result.error(e.getCode(), e.getMessage()));
}
// 处理算术异常(示例)
@ExceptionHandler(ArithmeticException.class)
public ResponseEntity<Result<?>> handleArithmeticException(ArithmeticException e) {
return ResponseEntity.ok(Result.error(500, "计算错误: " + e.getMessage()));
}
// 处理所有未捕获的异常
@ExceptionHandler(Exception.class)
public ResponseEntity<Result<?>> handleGlobalException(Exception e) {
// 记录日志(实际项目需添加)
e.printStackTrace();
return ResponseEntity.ok(Result.error(500, "系统繁忙,请稍后再试"));
}
// 处理Spring参数校验异常(需结合@Validated使用)
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Result<?>> handleValidationException(MethodArgumentNotValidException e) {
String errorMsg = e.getBindingResult().getFieldErrors().stream()
.map(error -> error.getField() + ": " + error.getDefaultMessage())
.collect(Collectors.joining(", "));
return ResponseEntity.ok(Result.error(400, "参数错误: " + errorMsg));
}
}
```
---
### 3. 自定义业务异常类(可选)
```java
package com.example.exception;
public class BusinessException extends RuntimeException {
private int code;
public BusinessException(int code, String message) {
super(message);
this.code = code;
}
public int getCode() {
return code;
}
}
```
---
### 4. Controller中使用示例
```java
@RestController
public class DemoController {
@GetMapping("/test")
public Result<Integer> divide(@RequestParam int a, @RequestParam int b) {
if (b == 0) {
throw new BusinessException(4001, "分母不能为零"); // 触发自定义异常
}
return Result.success(a / b);
}
}
```
---
### 5. 返回结果示例
- **成功响应**:
```json
{
"code": 200,
"msg": "成功",
"data": 5
}
```
- **错误响应**:
```json
{
"code": 4001,
"msg": "分母不能为零",
"data": null
}
```
---
### 关键点说明
1. **`@RestControllerAdvice`**
组合了 `@ControllerAdvice` 和 `@ResponseBody`,自动将返回对象转为JSON。
2. **异常优先级**
Spring会匹配最具体的异常处理器(例如优先处理 `ArithmeticException` 而非 `Exception`)。
3. **HTTP状态码**
示例中统一返回200,通过 `Result.code` 区分业务状态。若需要动态设置HTTP状态码(如401/403),可修改 `ResponseEntity` 的第一个参数。
4. **扩展性**
可继续添加更多 `@ExceptionHandler` 方法处理其他异常类型(如 `NullPointerException`, `IOException` 等)。
阅读全文
相关推荐


















