Spring MVC 中的 `@ExceptionHandler` 注解有什么作用?

推荐答案

@ExceptionHandler 注解用于在 Spring MVC 中处理控制器方法抛出的异常。通过在控制器类中定义一个方法并使用 @ExceptionHandler 注解,可以捕获并处理特定类型的异常,从而避免异常直接传播到客户端。

本题详细解读

1. @ExceptionHandler 的基本用法

@ExceptionHandler 注解通常用于控制器类中的方法上,用于处理该控制器中抛出的异常。它可以指定一个或多个异常类型作为参数,表示该方法将处理这些类型的异常。

-- -------------------- ---- -------
-----------
------ ----- ------------ -

    ---------------------------------------------- --------------------------------
    ------ ---------------------- ------------------------- --- -
        ------ --- -------------------- ----- --------- - - ---------------- ------------------------
    -

    -----------------------
    ------ ------ --------- -
        ----- --- ----------------------------- ------------
    -
-

在上面的例子中,handleException 方法将处理 NullPointerExceptionIllegalArgumentException 类型的异常。

2. @ExceptionHandler 的作用范围

@ExceptionHandler 注解的方法可以处理以下类型的异常:

  • 当前控制器中抛出的异常。
  • 当前控制器中调用的其他方法抛出的异常。
  • 当前控制器中调用的服务层或数据访问层抛出的异常。

3. @ExceptionHandler 方法的返回值

@ExceptionHandler 方法的返回值可以是任何类型,通常包括:

  • ModelAndView:用于返回视图和模型数据。
  • ResponseEntity:用于返回 HTTP 响应,包括状态码和响应体。
  • String:用于返回视图名称。
  • void:如果不需要返回任何内容。

4. @ExceptionHandler@ControllerAdvice 的结合使用

@ExceptionHandler 通常与 @ControllerAdvice 注解结合使用,以实现全局异常处理。@ControllerAdvice 注解的类可以包含多个 @ExceptionHandler 方法,这些方法将应用于所有控制器。

在这个例子中,handleGlobalException 方法将处理所有控制器中抛出的 Exception 类型异常。

5. @ExceptionHandler 的优先级

如果在控制器类和 @ControllerAdvice 类中都定义了处理相同异常类型的 @ExceptionHandler 方法,控制器类中的方法将优先执行。

6. @ExceptionHandler 的局限性

@ExceptionHandler 只能处理控制器中抛出的异常,无法处理过滤器或拦截器中抛出的异常。对于这些情况,可以使用 @ControllerAdvice 结合 @ExceptionHandler 来实现全局异常处理。

纠错
反馈