在Spring Boot中,异常处理是一个重要的方面,它可以帮助我们有效地处理应用程序中出现的异常情况,提供友好的错误信息,并采取适当的措施来处理这些异常。以下是Spring Boot中异常处理的几种常见方式:
全局异常处理器(Global Exception Handler):通过创建一个全局异常处理器,可以捕获应用程序中未被处理的异常,并提供统一的错误响应。为此,您可以创建一个类并添加
@ControllerAdvice
注解,然后在该类中定义各种异常的处理方法,使用@ExceptionHandler
注解指定要处理的异常类型。@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<ErrorResponse> handleException(Exception ex) { ErrorResponse error = new ErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(), "Internal Server Error"); return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR); } }
上述示例中的
handleException
方法会处理所有类型的Exception
异常,并返回一个自定义的错误响应。自定义异常处理器:除了处理全局异常外,您还可以定义自定义的异常类,并为其编写专门的异常处理器。这样可以更细粒度地处理特定类型的异常,并提供更具体的错误信息和行为。
public class CustomException extends RuntimeException { // 自定义异常类 } @ControllerAdvice public class CustomExceptionHandler { @ExceptionHandler(CustomException.class) public ResponseEntity<ErrorResponse> handleCustomException(CustomException ex) { ErrorResponse error = new ErrorResponse(HttpStatus.BAD_REQUEST.value(), ex.getMessage()); return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST); } }
上述示例中的
handleCustomException
方法会处理CustomException
异常,并返回一个自定义的错误响应。使用@RestControllerAdvice注解:在Spring Boot 2.3及以上版本中,可以使用
@RestControllerAdvice
注解替代@ControllerAdvice
和@ResponseBody
注解的组合。这样可以更方便地定义全局异常处理器,并直接返回响应体,而无需显式使用ResponseEntity
。@RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ErrorResponse handleException(Exception ex) { ErrorResponse error = new ErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(), "Internal Server Error"); return error; } }
上述示例中的
handleException
方法会处理所有类型的Exception
异常,并直接返回一个自定义的错误响应。使用@ControllerAdvice注解处理特定控制器的异常:您还可以使用
@ControllerAdvice
注解限定处理特定控制器的异常。这样可以为不同的控制器定义不同的异常处理逻辑。@ControllerAdvice(assignableTypes = {UserController.class, OrderController.class}) public class ControllerExceptionHandler { @ExceptionHandler(UserNotFoundException.class) public ResponseEntity<ErrorResponse> handleUserNotFoundException(UserNotFoundException ex) { ErrorResponse error = new ErrorResponse(HttpStatus.NOT_FOUND.value(), ex.getMessage()); return new ResponseEntity<>(error, HttpStatus.NOT_FOUND); } @ExceptionHandler(OrderNotFoundException.class) public ResponseEntity<ErrorResponse> handleOrderNotFoundException(OrderNotFoundException ex) { ErrorResponse error = new ErrorResponse(HttpStatus.NOT_FOUND.value(), ex.getMessage()); return new ResponseEntity<>(error, HttpStatus.NOT_FOUND); } }
上述示例中的
handleUserNotFoundException
方法处理UserController
中的UserNotFoundException
异常,而handleOrderNotFoundException
方法处理OrderController
中的OrderNotFoundException
异常。