1
  • 异常处理并非设计用于处理与异步事件相关的问题(例如,磁盘 I/O 完成、网络消息到达、鼠标点击和击键),这些问题与程序的控制流并行且独立地发生。

异常处理如何不是为处理异步事件而设计的?为什么会这样?

如果您通过非常详细的示例增强您的答案,我将不胜感激。

4

1 回答 1

2

我认为这是一种误导性的说法。

异步工作是通过 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 本身中添加一些异常捕获逻辑。

于 2013-06-28T13:00:36.907 回答