全局异常统一处理
引言
以前使用的传统的Try-Catch语句,可能存在大量的重复代码和不一致性问题。
此外抛出未处理的异常时,用户会看到系统生成的默认错误页面,用户体验较差。
而使用全局异常统一处理后就有了以下优点:
- 减少代码冗余
- 提高代码可维护性
- 统一异常处理策略
- 自定义异常处理
- 提升用户体验
- 增强安全性
- 符合RESTful API设计原则
- 方便日志记录
使用方式:
第一步: 自定义异常类(也可以不自定义,比如统一针对JDK已有异常做处理)
/**
* 自定义运行时异常基类
*/
public class BaseException extends RuntimeException {
public BaseException() {
}
public BaseException(String message) {
super(message);
}
}
第二步:编写统一异常处理类,统一捕获处理返回
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* 全局异常处理器,处理项目中抛出的运行时异常
*/
//此注解用来指定该类是异常处理类
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* 捕获业务异常
* @param ex
* @return
*/
@ExceptionHandler
public Result exceptionHandler(BaseException ex){
//自定义公共返回结果类
return Result.error(ex.getMessage());
}
}
以上出现注解的详细解释
-
@RestControllerAdvice
注解主要用于Spring MVC和Spring Boot应用程序中,以定义全局异常处理类。-
@RestControllerAdvice
是一个组合注解,由@ControllerAdvice
和@ResponseBody
组成。 -
@ControllerAdvice
本身继承了@Component
,因此@RestControllerAdvice
本质上也是一个Component。 -
@RestControllerAdvice
用于定义@ExceptionHandler
、@InitBinder
和@ModelAttribute
方法,这些方法适用于所有使用@RequestMapping
注解的方法。 -
它允许开发者以集中的方式处理整个应用程序的异常,当应用程序中的任何控制器方法抛出异常时,
@RestControllerAdvice
注解所标注的类可以拦截并处理这些异常。
-
-
@ExceptionHandler
注解用于处理整个应用程序中抛出的异常
-
指定异常类型:
@ExceptionHandler
注解可以指定一个或多个要处理的异常类型。当这些类型的异常被抛出时,Spring MVC会自动调用对应的@ExceptionHandler
方法。@ExceptionHandler(NullPointerException.class) public String handleNullPointerException(NullPointerException ex) { // 处理NullPointerException的逻辑 return "errorPage"; }
如果不指定异常类型,则
@ExceptionHandler
方法将尝试处理所有抛出的异常(但通常不建议这样做,因为它可能导致意外的行为)。 -
处理异常:
@ExceptionHandler
方法可以接受一个或多个参数,其中最常用的是异常对象本身。通过该参数,开发者可以访问异常的详细信息,如异常消息、堆栈跟踪等。@ExceptionHandler public ResponseEntity<String> handleAllExceptions(Exception ex) { // 处理所有异常的逻辑 return new ResponseEntity<>("An error occurred: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); }
-
返回类型:
@ExceptionHandler
方法的返回类型可以是任意类型,但通常建议返回与控制器方法相同的类型,以保持API的一致性。