推荐答案
@ExceptionHandler
注解用于在 Spring MVC 中处理控制器方法抛出的异常。通过在控制器类中定义一个方法并使用 @ExceptionHandler
注解,可以捕获并处理特定类型的异常,从而避免异常直接传播到客户端。
本题详细解读
1. @ExceptionHandler
的基本用法
@ExceptionHandler
注解通常用于控制器类中的方法上,用于处理该控制器中抛出的异常。它可以指定一个或多个异常类型作为参数,表示该方法将处理这些类型的异常。
-- -------------------- ---- ------- ----------- ------ ----- ------------ - ---------------------------------------------- -------------------------------- ------ ---------------------- ------------------------- --- - ------ --- -------------------- ----- --------- - - ---------------- ------------------------ - ----------------------- ------ ------ --------- - ----- --- ----------------------------- ------------ - -
在上面的例子中,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
来实现全局异常处理。