SpringBoot自定义异常+全局异常处理
什么是全局异常处理
我们在编写程序的过程中,难免遇到各种各样的异常。如果我们每遇到异常,都用try{…} catch{…}去捕获异常,这处理业务的代码和处理异常的代码相互搅合在一起,且捕获异常的方法存在大量冗余,严重影响了代码的可读性。这时候,全局异常处理就显着非常重要,因为它可以帮助我们优雅的去处理异常。
自定义异常
Java虽然提供了大量的异常处理类,但实际开发中还不足以满我们的需求,这时候我们可以通过自定义异常来更快的定位错误,解决问题。
我们自定义异常的时候通常继承RuntimeException类,主要是基于以下考虑:
- 编程风格和约定: Java中的运行时异常通常表示程序员的错误,而检查异常通常表示外部因素引发的问题。如果您的自定义异常继承自
RuntimeException
,那么它们更有可能被视为编程错误,而不是需要强制捕获的外部因素。这可以帮助开发人员更好地理解和遵循编程风格和约定。- 减少冗余异常处理: 继承
RuntimeException
的自定义异常不需要强制捕获或声明,这可能减少了在方法签名中添加throws
声明的需求,从而减少了冗余的异常处理代码。注意事项:
- 不受检查的异常: 继承
RuntimeException
的异常被称为不受检查的异常,这意味着编译器不会强制要求您在代码中捕获或声明它们。这可能会导致潜在的运行时错误,因为开发人员不必捕获这些异常。因此,如果您使用RuntimeException
,需要特别小心确保您的代码能够处理这些异常,或者至少要在文档中明确说明这些异常可能会被抛出。- 可读性和可维护性: 在某些情况下,过度使用
RuntimeException
可能会导致可读性和可维护性问题,因为它们不需要明确的异常处理。这可能使代码的行为难以理解,特别是在大型项目中
- 首先自定义一个异常类,继承RuntimeException,并编写一个构造方法。
public class IllegalLoginException extends RuntimeException{
public IllegalLoginException(String message){
super(message);
}
}
- 增加全局异常处理(RestControllerAdvice+@ExceptionHandler())
@RestControllerAdvice
public class UserExceptionHandler {
@ExceptionHandler(IllegalLoginException.class)
public HttpResp<String> illegalLoginException(IllegalLoginException e){
return HttpResp.error(e.getMessage());
}
@ExceptionHandler(NotVipUserException.class)
public HttpResp<String> notVipUserException(NotVipUserException e){
return HttpResp.error(e.getMessage());
}
}
@RestControllerAdvice
:这是一个 Spring Framework 的注解,它标识了这个类是一个全局异常处理器。它告诉 Spring Boot,该类中的方法将处理应用程序中抛出的异常。@ExceptionHandler
:这是另一个 Spring Framework 的注解,它用于标识异常处理方法。每个@ExceptionHandler
方法处理特定类型的异常。在上面的代码中,有两个@ExceptionHandler
方法,分别处理IllegalLoginException
和NotVipUserException
异常。- 方法体:每个
@ExceptionHandler
方法接受异常作为参数,可以在方法中执行自定义的异常处理逻辑。通常,这些方法将异常信息封装为适当的响应(通常是 JSON 格式)并返回给客户端。在这个示例中,异常信息被封装为HttpResp
对象,并返回一个表示错误的响应。
这种全局异常处理的好处是,您可以将异常处理逻辑集中在一个地方,而不必在应用程序中的每个可能引发异常的地方重复编写相同的处理代码。这提高了代码的可维护性,使您能够更容易地管理异常情况并提供一致的错误响应。
参考博客:RuntimeException和Exception区别 - jtlgb - 博客园 (cnblogs.com)