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
创建线程。
- 我应该声明从方法签名中的方法抛出的所有exception还是仅仅exception的超类?
- 为什么Java编译器允许在throws部分中列出exception,该方法无法抛出exception
- 如何在调用Thread.sleep()时修复未处理exception的编译错误?
- 什么是来自.net的java等效的AggregateException?
- 用运行时exception替换已检查的exception?
- 在Java中,是使用throws Exception而不是抛出多个特定exception的好习惯?
- Java的exception处理机制是责任链设计模式的一个例子吗?
- 在Java中拯救吞噬的exception
- 何时使用catch以及何时在exception处理中使用throws