1 概述:Spring @ExceptionHandler ∈ spring-web
作用
-
ExceptionHandler
是 Spring 框架(spring-web
模块)提供的一个注解,用于处理应用程序中的异常。
当应用程序中发生异常时,ExceptionHandler
将优先地拦截异常并处理它,然后将处理结果返回到前端。
该注解可用于类级别和方法级别,以捕获不同级别的异常。 -
在
Spring
中使用ExceptionHandler
非常简单,只需在需要捕获异常的方法上注解@ExceptionHandler
,然后定义一个方法,该方法将接收异常并返回异常信息,并将该异常信息展示给前端用户。
注意事项
Controller
类下多个@ExceptionHandler
上的异常类型不能出现相同的;否则,运行时抛异常。@ExceptionHandler
下方法返回值类型支持多种,常见的ModelAndView,@ResponseBody注解标注,ResponseEntity等类型都可以
2 应用场景
CASE : 基于 具体 Controller 的 异常捕获策略
@RestController
public class XxxxController {
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleException(Exception ex) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("An error occurred: " + ex.getMessage());
}
@RequestMapping("/xxx/api")
public String test() throws Exception {
throw new Exception("Test exception!");
}
}
CASE : 基于 @ControllerAdvice 的全局异常捕获策略(ApplicationExceptionHandler)
import xxx.common.exception.ApplicationException;
import xxx.model.dto.XResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@ControllerAdvice // controller 切面注解
public class ApplicationExceptionHandler {
private final static Logger logger = LoggerFactory.getLogger(ApplicationExceptionHandler.class);
//已知异常的捕获
@ExceptionHandler(value = ApplicationException.class) //表示当 ApplicationException 的异常被抛出时,执行此方法
public XResponse handleApplicationException(ApplicationException exception){
logger.error("Operation Fail! errorCode: {}, errorMessage: {}, cause : {}", exception.getErrorCode(), exception.getErrorMessage(), exception.getCause());
return XResponse.failure(exception.getErrorCode(), exception.getErrorMessage());
}
//未知异常
@ExceptionHandler
public XResponse handleOtherException(Exception e){
//ModelAndView mv=new ModelAndView(); mv.addObject("tips","请稍后测试"); mv.setViewName("defaultError");
logger.error("Operation Fail! errorMessage: {}, cause : {}", e.getMessage(), e.getCause());
XResponse response = XResponse.failure(null, e.getMessage());
return response;
}
//@ExceptionHandler(Exception.class)
//public ResponseEntity<String> handleException(Exception ex) {
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
// .body("An error occurred: " + ex.getMessage());
//}
}