螺竹编程
发布于 2024-06-01 / 3 阅读
0

SpringBoot基础/其他:Spring Boot Exception

在Spring Boot中,异常处理是一个重要的方面,它可以帮助我们有效地处理应用程序中出现的异常情况,提供友好的错误信息,并采取适当的措施来处理这些异常。以下是Spring Boot中异常处理的几种常见方式:

  1. 全局异常处理器(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异常,并返回一个自定义的错误响应。

  2. 自定义异常处理器:除了处理全局异常外,您还可以定义自定义的异常类,并为其编写专门的异常处理器。这样可以更细粒度地处理特定类型的异常,并提供更具体的错误信息和行为。

    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异常,并返回一个自定义的错误响应。

  3. 使用@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异常,并直接返回一个自定义的错误响应。

  4. 使用@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异常。