返回

Spring Boot 全局异常处理,如有万一

见解分享

前言

在 Spring Boot 应用中,异常处理是一个非常重要的部分,它可以帮助我们及时发现和处理错误,避免应用程序崩溃。在上一篇博文中,我们介绍了一种 Spring Boot 全局异常处理的方法,但那是一种针对所有异常类型的容错机制,虽然方便,但对于某些特殊异常,可能并不适用。

因此,在本文中,我们将介绍另一种 Spring Boot 全局异常处理的方法,它使用统一的 try-catch 机制来处理异常,这种方法的好处是:

  • 可以针对不同的异常类型,制定不同的处理策略。
  • 错误代码和错误信息更加准确,便于定位问题。
  • 可以记录异常信息,方便排查问题。

实现步骤

  1. 在 Spring Boot 项目中创建一个 BaseExceptionHandler 类,这个类将作为所有异常处理器的父类。
@ControllerAdvice
public class BaseExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ResponseEntity<Object> handleException(Exception ex) {
        // 根据异常类型返回不同的错误码和错误信息
        if (ex instanceof NullPointerException) {
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("空指针异常");
        } else if (ex instanceof IllegalArgumentException) {
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("参数不合法");
        } else {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("系统错误");
        }
    }
}
  1. 创建一个子类来处理具体的异常类型,例如:
@ControllerAdvice
public class NullPointerExceptionHandler extends BaseExceptionHandler {

    @ExceptionHandler(NullPointerException.class)
    public ResponseEntity<Object> handleNullPointerException(NullPointerException ex) {
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("空指针异常");
    }
}
  1. 在 Spring Boot 启动类上添加 @ControllerAdvice@ExceptionHandler 注释,以激活异常处理功能。
@SpringBootApplication
@ControllerAdvice
@ExceptionHandler(Exception.class)
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

优点

  • 可以针对不同的异常类型,制定不同的处理策略。
  • 错误代码和错误信息更加准确,便于定位问题。
  • 可以记录异常信息,方便排查问题。

缺点

  • 相比于之前的统一异常处理机制,这种方法需要更多的代码来实现。
  • 可能会出现遗漏异常的情况,需要考虑周全。

总结

在本文中,我们介绍了 Spring Boot 全局异常处理的另一种方法,这种方法使用统一的 try-catch 机制来处理异常。这种方法的好处是:可以针对不同的异常类型,制定不同的处理策略;错误代码和错误信息更加准确,便于定位问题;可以记录异常信息,方便排查问题。但是,这种方法也有一个缺点,就是需要更多的代码来实现。