下面我将为你详细讲解“SpringBoot项目优雅的全局异常处理方式(全网最新)”的完整攻略。
1. 什么是全局异常处理
全局异常处理指的是通过统一的方式来处理应用程序发生的异常,而不是在每个可能抛出异常的地方都进行异常处理。在 Spring Boot 项目中,使用全局异常处理能够将异常处理代码从业务逻辑中剥离出来,便于维护和重用。
2. 如何实现全局异常处理
在 Spring Boot 项目中,实现全局异常处理可以通过以下几个步骤:
2.1 新建全局异常处理器
在项目中新建一个全局异常处理器类,该类需要继承 ResponseEntityExceptionHandler
类,然后在类中实现需要处理的异常。
@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
public ResultVO<Object> handle(Exception ex) {
log.error("Exception: ", ex);
return new ResultVO<>(500, ex.getMessage(), null);
}
}
上面的代码中,通过在类上使用 @ControllerAdvice
注解,将该类标记为全局异常处理器。在类中定义了一个处理 Exception
类型异常的方法,通过在方法上使用 @ExceptionHandler
注解来指定该方法处理的异常类型。在方法中,对异常进行处理,并返回统一格式的异常信息。
2.2 自定义异常
在实际开发中,我们在抛出异常时往往需要传递一些自定义的异常信息。因此,我们需要自定义一些异常类。
public class BusinessException extends RuntimeException {
private Integer code;
public BusinessException(Integer code, String message) {
super(message);
this.code = code;
}
public Integer getCode() {
return code;
}
}
自定义异常通过继承 RuntimeException
实现。上面的代码中,我们定义了一个 BusinessException
异常类,其中包含了错误码和错误信息。通过自定义异常,我们能够更好地区分不同类型的异常,并将异常信息统一到一个地方进行管理。
2.3 抛出自定义异常
在代码中抛出自定义异常时,可以使用 throw new BusinessException(code, message)
的方式。在全局异常处理器中,需要实现对自定义异常的处理。下面是一个处理 BusinessException
异常的示例:
@ExceptionHandler(BusinessException.class)
@ResponseBody
public ResultVO<Object> handleBusinessException(BusinessException ex) {
log.error("BusinessException: ", ex);
return new ResultVO<>(ex.getCode(), ex.getMessage(), null);
}
3. 示例演示
下面是一个在 Spring Boot 项目中使用全局异常处理的实例:
3.1 定义自定义异常
定义一个自定义异常 MyException
:
public class MyException extends RuntimeException {
private String code;
public MyException(String code, String message) {
super(message);
this.code = code;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
3.2 抛出自定义异常
在代码中抛出自定义异常:
@GetMapping("/hello")
public String hello() {
throw new MyException("1001", "Hello Exception");
}
3.3 全局异常处理
创建一个全局异常处理器 GlobalExceptionHandler
:
@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(MyException.class)
@ResponseBody
public ResultVO<Object> handleMyException(MyException ex) {
return new ResultVO<>(ex.getCode(), ex.getMessage(), null);
}
@Override
protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {
return new ResponseEntity<>(new ResultVO<>(status.value(), ex.getMessage(), null), status);
}
}
在处理器中,我们定义了一个处理 MyException
异常的方法,并返回统一的结果 ResultVO
。另外,我们还重写了 ResponseEntityExceptionHandler
类中的 handleExceptionInternal()
方法,该方法用于处理 Spring Boot 内置的异常,例如 MethodArgumentNotValidException
和 HttpMessageNotReadableException
等。在默认的情况下,Spring Boot 会将这些异常转换为 HTTP 错误码 500,通过重写 handleExceptionInternal()
方法,我们可以将其转换为统一的格式。
4. 总结
Spring Boot 项目中实现全局异常处理,能够将异常处理代码从业务逻辑中分离出来,便于维护和重用。通过以上步骤,可以实现一个优雅的全局异常处理方案,并将业务中的各种异常都转为统一的格式,方便前后端的交互。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot项目优雅的全局异常处理方式(全网最新) - Python技术站