推荐答案
@ExceptionHandler 注解用于在 Spring MVC 中处理控制器方法抛出的异常。通过在控制器类中定义一个方法并使用 @ExceptionHandler 注解,可以捕获并处理特定类型的异常,从而避免异常直接传播到客户端。
本题详细解读
1. @ExceptionHandler 的基本用法
@ExceptionHandler 注解通常用于控制器类中的方法上,用于处理该控制器中抛出的异常。它可以指定一个或多个异常类型作为参数,表示该方法将处理这些类型的异常。
// www.javascriptcn.com code example
@Controller
public class MyController {
@ExceptionHandler({NullPointerException.class, IllegalArgumentException.class})
public ResponseEntity<String> handleException(Exception ex) {
return new ResponseEntity<>("An error occurred: " + ex.getMessage(), HttpStatus.BAD_REQUEST);
}
@GetMapping("/example")
public String example() {
throw new NullPointerException("Example exception");
}
}在上面的例子中,handleException 方法将处理 NullPointerException 和 IllegalArgumentException 类型的异常。
2. @ExceptionHandler 的作用范围
@ExceptionHandler 注解的方法可以处理以下类型的异常:
- 当前控制器中抛出的异常。
- 当前控制器中调用的其他方法抛出的异常。
- 当前控制器中调用的服务层或数据访问层抛出的异常。
3. @ExceptionHandler 方法的返回值
@ExceptionHandler 方法的返回值可以是任何类型,通常包括:
ModelAndView:用于返回视图和模型数据。ResponseEntity:用于返回 HTTP 响应,包括状态码和响应体。String:用于返回视图名称。void:如果不需要返回任何内容。
4. @ExceptionHandler 与 @ControllerAdvice 的结合使用
@ExceptionHandler 通常与 @ControllerAdvice 注解结合使用,以实现全局异常处理。@ControllerAdvice 注解的类可以包含多个 @ExceptionHandler 方法,这些方法将应用于所有控制器。
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleGlobalException(Exception ex) {
return new ResponseEntity<>("Global error occurred: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}在这个例子中,handleGlobalException 方法将处理所有控制器中抛出的 Exception 类型异常。
5. @ExceptionHandler 的优先级
如果在控制器类和 @ControllerAdvice 类中都定义了处理相同异常类型的 @ExceptionHandler 方法,控制器类中的方法将优先执行。
6. @ExceptionHandler 的局限性
@ExceptionHandler 只能处理控制器中抛出的异常,无法处理过滤器或拦截器中抛出的异常。对于这些情况,可以使用 @ControllerAdvice 结合 @ExceptionHandler 来实现全局异常处理。