【发布时间】:2018-04-09 08:13:34
【问题描述】:
编辑:
How to catch an Exception from a thread - 这不是重复。该链接指的是直接线程(子线程),这里不是这种情况!我们正在谈论间接(孙子线程)。子线程是封闭的JAR(我没有写权限)
我有以下方法:f1 我没有写权限(这是一个封闭的JAR)。
f1 在抛出异常的新线程上创建并运行一个任务。
在main 方法上,我必须在新线程上调用f1。我需要能够捕获从f1 的子线程抛出的所有异常。
换句话说,我如何在不更改son 线程的情况下从grandson 线程捕获异常。
main method opens new thread and call:
|
V
f1 method opens new thread and call:
|
V
anonymous method which throws exception
示例代码:
private static void f1() {
Executors.newSingleThreadExecutor()
.submit(() -> {
try {
throw new Exception("exception from anonymous thread");
} catch (Exception e) {
e.printStackTrace();
throw e;
}
});
}
public void main() {
final Future<?> submit = Executors.newSingleThreadExecutor()
.submit(() -> f1());
try {
submit.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
【问题讨论】:
-
ExecutionException 会将抛出的异常作为根本原因
-
@GhostCat 这不是同一个问题!您的重复是指定向线程(子线程),这里不是这种情况!我们在谈论间接(孙子线程)
-
@GhostCat OP 没有问同样的问题。您的链接是指一个问题,该问题必须对代码进行写访问,而 OP 没有。
-
@ᴳᵁᴵᴰᴼ 我查过了,没有。
-
没有机会。请记住,当您的
main方法的submit.get()返回时,无法保证由f1()生成的异步任务甚至已经完成,更不用说已经传递了一个可检查的异常。甚至链接答案的UncaughtExceptionHandler也无济于事,因为异常并非没有被发现。当使用submit时,作业将被包装在一个将捕获任何异常的未来中,因此如果get被调用,它可以被传播。由于没有人保留对那个未来的引用,所以异常丢失了。不修改f1(),没办法。
标签: java multithreading exception