JAVA全局异常捕获机制

2024-01-29 14:16:28 浏览数 (3)

在开发Java应用程序时,异常处理显得尤为重要。只有正确处理所有可能出现的异常,才能确保应用的健壮性和稳定性。传统上,我们会在每个可能抛出异常的方法中使用try-catch捕获异常,这当然可以解决问题,但代码冗长且难以维护。相比之下,使用AOP(Aspect Oriented Programming)来实现全局异常捕获会更加优雅高效。

Java异常基础

在Java中,所有异常都继承于Throwable类。主要分为两大类:Checked Exception和Unchecked Exception。

  • Checked Exception:编译时即可检查到的异常,如IOException。必须用try-catch捕获或在方法声明上抛出。
  • Unchecked Exception:运行时异常,如NullPointerException。不需要捕获也可编译通过。

除此之外,Error并不是一个Exception,表示严重问题无法进行恢复。

传统方式-方法内catch

我们可以在每个可能抛出异常的方法内用try-catch来捕获:

代码语言:java复制
public void method() {
  try {
    // code 
  } catch (Exception e) {
    // handle exception
  }
}

这种方式容易产生大量重复代码,维护复杂。如果忘记添加catch也会导致部分异常无法处理。

AOP实现全局捕获

AOP思想是将公共功能从主线业务中分离出来形成一个独立模块。我们可以用AOP框架如Spring AOP或AspectJ实现全局异常捕获:

代码语言:java复制
@Aspect
public class GlobalExceptionHandler {

  @AfterThrowing(value = "execution(* com.example.service.*.*(..))", throwing="ex")
  public void handleException(Exception ex) {
    // 统一处理所有服务层抛出的异常
  }

}

实战技巧

除捕获异常,我们还可以返回一个友好的错误码:

代码语言:java复制
@AfterThrowing(value = "execution(* com.example.controller.*.*(..))", throwing="ex")
public ResponseEntity handleControllerException(Exception ex) {
  return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
    .body(Result.fail("10000", ex.getMessage()));
}

同时,记录到日志中有助于问题排查:

代码语言:java复制
@AfterThrowing(value = "execution(* com.example..*(..))", throwing="ex")
public void logException(Exception ex) {
  logger.error("异常:{}", ex);
}

这样不论方法内部抛出什么异常,我们都可以实现统一处理。大大提高了应用的可靠性。

是不是很炫酷!请给个小红心支持一下。下次再聊更多AOP技巧。

0 人点赞