通过try-catch捕获Exception可处理大多数运行时异常,但无法捕获Error;2. 使用Thread.setDefaultUncaughtExceptionHandler可全局捕获未处理异常;3. Spring Boot中@ControllerAdvice能统一处理Web层异常;4. 应结合多种机制实现完整异常管理,确保日志记录与用户友好反馈。
在Java中,虽然不能真正“捕获所有异常”到系统级程度(如JVM崩溃),但可以通过合理设计来捕获和处理绝大多数程序运行时的异常。实现全局异常捕获的核心方式包括:使用try-catch块、自定义异常处理器、以及利用Thread的未捕获异常机制。下面介绍几种实用方法。
在方法内部用try-catch包裹可能出错的代码:
示例:
try {
int result = 10 / 0;
} catch (Exception e) {
System.out.println("发生异常:" + e.getMessage());
}
catch(Exception e) 可以捕获所有继承自Exception的异常,但不包括Error(如OutOfMemoryError)。
为防止主线程或其他线程抛出未处理异常导致程序突然退出,可以设置全局处理器:
示例:
public class GlobalExceptionHandler {
public static void main(String[] args) {
// 设置默认的未捕获异常处理器
Thread.setDefaultUncaughtExceptionHandler((t, e) -> {
System.err.println("线程 " + t.getName() + " 发生未捕获异常:");
e.printStackTrace();
});
// 模拟异常
new Thread(() -> {
throw new RuntimeException("测试异常");
}).start();
}
}
这个方法能捕获所有未被try-catch处理的RuntimeException及其子类异常。
处理(@ControllerAdvice)通过@ControllerAdvice配合@ExceptionHandler,可以统一处理控制器层抛出的异常。
示例:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
public Map
Map
response.put("error", "系统异常");
response.put("message", e.getMessage());
return response;
}
}
这样无论哪个Controller抛出Exception,都会被这个方法拦截并返回友好信息。
虽然可以捕获大部分异常,但以下几点需注意:
基本上就这些。合理结合try-catch、线程异常处理器和框架提供的机制,就能实现较为完整的全局异常捕获能力。关键是根据项目类型选择合适的方法,做到异常可追踪、可恢复、不影响用户体验。