在哪里捕获 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() 引发的异常 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Scala 捕获一系列期货引发的错误

谁在抛出(并捕获)这个 MySQL 异常?

未捕获异步方法中引发的异常 - 为啥?

捕获异步 void 方法引发的异常

在表格行中添加子视图时引发未捕获的异常

自动捕获 BlazeDS 远程处理方法引发的所有异常?