我更喜欢在main方法附近的调用堆栈中进一步使用异常处理逻辑。我喜欢这种方法...但是,我创建了一个线程,其中run()内部的一些方法调用可能会抛出异常。我真的想看看是否有一种方法可以将这些异常抛回到父线程?我能想到的最好的方法是在实现Runnable
的对象中设置一个变量。此变量是一个包含错误消息的字符串,然后使用类加载器在父线程中正确地重新创建相同的异常。
我想知道的是,是否有一种不那么混乱的方式来获得我想要的东西? (为了能够确保在子线程中抛出的任何异常都使用相同的异常处理逻辑来处理,就好像它在主线程/代码重用中运行一样)。
答案 0 :(得分:26)
您可以在此处使用ExecutorService来提交可调用内容并接收Future。在这一点上,您至少希望将异常传播到您将调用的调用线程future.get()
future.get()会将调用方法中抛出的任何异常传播给调用future.get()的线程。因此,如果您的主线程调用future.get(),那么主线程将看到抛出的任何异常。
答案 1 :(得分:4)
使用Thread.setUncaughtExceptionHandler(),您可以在Thread
中设置Thread.UncaughtExceptionHandler,并拥有处理线程异常的集中逻辑。
此外,您可以编写自己的ThreadFactory,创建预设Thread.UncaughtExceptionHandler
的线程。
答案 2 :(得分:3)
在run()方法的外层抓住它,然后将Exception放在Runnable的变量中,让Runnable表明它已完成。
启动runnable的代码必须检查Runnable,看看是否设置了“Exception”对象并重新抛出或处理它。
如果你重新抛出它,你可能想把它包装在一个新的例外中:
throw new Exception(oldException);
这将为您提供两个堆栈跟踪。
(谢谢Taylor L)