Spring中异常处理方式-@RestControllerAdvice全局处理和局部处理

`@RestControllerAdvice` 是 Spring 框架中用于全局处理 RESTful 接口异常的注解。它结合了 `@ControllerAdvice` 和 `@ResponseBody` 的功能,主要用于处理 RESTful 接口抛出的异常,并以 JSON 格式返回错误信息。

### 主要作用:
- **全局异常处理**:`@RestControllerAdvice` 注解标记的类可以全局处理 RESTful 接口抛出的异常。
- **返回 JSON 响应**:异常处理方法在处理异常后会以 JSON 格式返回错误信息,适合 RESTful 接口。

### 特点和用法:
- 在类级别使用 `@RestControllerAdvice` 注解表示该类是一个全局异常处理类,用于处理所有 Controller 层抛出的异常。
- 通常结合 `@ExceptionHandler` 注解一起使用,用于标记处理特定异常的方法。
- 可以定义多个异常处理方法,每个方法处理不同类型的异常,以实现精确的异常处理逻辑。
- 异常处理方法可以返回自定义的错误信息,也可以返回标准的错误信息格式,如统一的 JSON 结构。

### 示例:
```java
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ResponseEntity<ErrorResponse> handleException(Exception ex) {
        ErrorResponse errorResponse = new ErrorResponse("Internal Server Error", ex.getMessage());
        return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
    }

    @ExceptionHandler(ResourceNotFoundException.class)
    public ResponseEntity<ErrorResponse> handleResourceNotFoundException(ResourceNotFoundException ex) {
        ErrorResponse errorResponse = new ErrorResponse("Resource Not Found", ex.getMessage());
        return new ResponseEntity<>(errorResponse, HttpStatus.NOT_FOUND);
    }
}
```

在上面的示例中,`GlobalExceptionHandler` 类使用 `@RestControllerAdvice` 注解来全局处理异常。它包含了两个异常处理方法,分别处理 `Exception` 和 `ResourceNotFoundException` 类型的异常,并返回自定义的错误信息以及对应的 HTTP 状态码。

除了使用全局异常处理机制(如 `@RestControllerAdvice`)来处理 RESTful 接口的异常外,Spring 还提供了其他方式来处理单个异常。以下是处理单个异常的一些常见方法:

### 1. **在 Controller 中处理异常:**
在 Controller 类的方法中直接使用 `@ExceptionHandler` 注解来处理特定异常,这种方法适用于局部异常处理。

```java
@Controller
public class MyController {

    @ExceptionHandler(MyCustomException.class)
    public ResponseEntity<ErrorResponse> handleCustomException(MyCustomException ex) {
        ErrorResponse errorResponse = new ErrorResponse("Custom Error", ex.getMessage());
        return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
    }
}
```

### 2. **在 Service 层处理异常:**
在 Service 层捕获异常并处理,然后将处理后的结果返回给 Controller 层。

```java
@Service
public class MyService {

    public void doSomething() {
        try {
            // Code that may throw an exception
        } catch (MyCustomException ex) {
            // Handle the exception
            throw ex; // or return a specific result
        }
    }
}
```

### 3. **使用 AOP(面向切面编程)处理异常:**
通过 AOP 可以将异常处理逻辑从业务逻辑中分离出来,提高代码的模块化和复用性。

```java
@Aspect
@Component
public class ExceptionAspect {

    @AfterThrowing(pointcut = "execution(* com.example.service.*.*(..))", throwing = "ex")
    public void handleException(MyCustomException ex) {
        // Handle the exception
    }
}
```

### 4. **自定义异常处理器:**
实现 `HandlerExceptionResolver` 接口,自定义异常处理器来处理特定异常。

```java
@Component
public class CustomExceptionHandler implements HandlerExceptionResolver {

    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        // Custom exception handling logic
        return new ModelAndView("error", "message", ex.getMessage());
    }
}
```

这些方法可以根据具体情况选择合适的方式来处理特定的异常,从而实现更灵活和精细的异常处理逻辑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值