- 异常处理并非设计用于处理与异步事件相关的问题(例如,磁盘 I/O 完成、网络消息到达、鼠标点击和击键),这些问题与程序的控制流并行且独立地发生。
异常处理如何不是为处理异步事件而设计的?为什么会这样?
如果您通过非常详细的示例增强您的答案,我将不胜感激。
- 异常处理并非设计用于处理与异步事件相关的问题(例如,磁盘 I/O 完成、网络消息到达、鼠标点击和击键),这些问题与程序的控制流并行且独立地发生。
异常处理如何不是为处理异步事件而设计的?为什么会这样?
如果您通过非常详细的示例增强您的答案,我将不胜感激。
我认为这是一种误导性的说法。
异步工作是通过 Java 中的线程(或进程,但那是另一回事)完成的。
事实是,如果您启动一个线程并且在该线程中引发异常,您将无法从主线程中捕获它。
但是没有什么能阻止您在该新线程中处理异常。
示例 - 下面的代码打印Exception was raised in the thread but we can still handle it
:
public static void main(String[] args) throws Exception {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
throw new RuntimeException("oops");
}
});
t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("Exception was raised in the thread but we can still handle it");
}
});
t.start();
}
或者,您可以在 Runnable 本身中添加一些异常捕获逻辑。