Java:处理子线程中的exception

我更喜欢在main方法附近的调用堆栈中进一步使用exception处理逻辑。 我喜欢这种方法……但是,我创建了一个线程,其中run()内部的一些方法调用可能会抛出exception。 我真的想看看是否有一种方法可以将这些exception抛回到父线程? 我能想到的最好的方法是在实现Runnable的对象中设置一个变量。 此变量是一个包含错误消息的字符串,然后使用类加载器在父线程中正确地重新创建相同的exception。

我想知道的是,是否有一种不那么混乱的方式来获得我想要的东西? (为了能够确保在子线程中抛出的任何exception都使用相同的exception处理逻辑来处理,就好像它在主线程/代码重用中运行一样)。

在run()方法的外层捕获它,然后将Exception放在Runnable中的变量中,让Runnable指示它已完成。

启动runnable的代码必须检查Runnable,看看是否设置了“Exception”对象并重新抛出或处理它。

如果您重新抛出它,您可能希望将其包装在一个新的exception中:

 throw new Exception(oldException); 

这将为您提供两个堆栈跟踪。

(谢谢Taylor L)

您可以在此处使用ExecutorService来提交可调用对象并接收Future。 在这一点上,您至少希望将exception传播到调用线程,您将调用future.get()

future.get()会将调用方法中抛出的任何exception传播给调用future.get()的线程。 因此,如果您的主线程调用future.get(),那么主线程将看到抛出的任何exception。

使用Thread.setUncaughtExceptionHandler(),您可以在Thread设置Thread.UncaughtExceptionHandler ,并具有处理线程exception的集中逻辑。

此外,您可以编写自己的ThreadFactory ,它将使用预设的Thread.UncaughtExceptionHandler创建线程。