在哪里捕获 Callable.call() 引发的异常 [重复]
Posted
技术标签:
【中文标题】在哪里捕获 Callable.call() 引发的异常 [重复]【英文标题】:Where to catch Exceptions thrown from Callable.call() [duplicate] 【发布时间】:2012-03-21 01:04:43 【问题描述】:可能重复:Handling exceptions from Java ExecutorService tasks
我使用 Java 中的 ExecutorService
来协调线程。
用于启动我使用的线程
pool = new ExecutorService(2);
callableResults = pool.invokeAll(threads);
为了收集结果,我为每个线程使用future.get()
。
“threads”是实现Callable
并覆盖call()
的类中的对象列表。
现在我遇到了以下问题。 call()
方法确实会引发各种特定的异常。 invokeAll()
和 future.get()
仅抛出 InterruptedException
。
在哪里可以捕获我在call()
中抛出的特定异常?还是我必须在那里处理它们?如果抛出这些异常之一,结果是InterruptedException
?
【问题讨论】:
我以前读过这个,但我没有看到他也使用 Callable 和 call() ?也许我监督了它!?编辑:正确。我监督过了。对不起。 在这个答案中:***.com/a/2248166/118846 他使用Runnable,但是异常捕获是一样的。Future.get()
抛出 InterruptedException
和 ExecutionException
。您需要更仔细地阅读 javadocs。
answer (***.com/a/2248166/302916) 可以。
【参考方案1】:
AFAIR java.util.concurrent.Future.get()
将抛出 ExecutionException
如果提供可调用的过去抛出异常(异常存储在 Future
中)。
尝试检索因抛出异常而中止的任务的结果时抛出异常。 可以使用
Throwable.getCause()
方法检查此异常。
【讨论】:
使用ExecutorService
的真正原因是它能够无阻塞地运行。另一方面,get()
在执行任务之前一直处于阻塞状态。似乎这是ExecutorService
的主要缺点之一以上是关于在哪里捕获 Callable.call() 引发的异常 [重复]的主要内容,如果未能解决你的问题,请参考以下文章