在编码期间,我想从Runnables中捕获一些异常。
我尝试使用以下代码捕获异常的代码:
public void fooBar(){
//nullable value
final String foo = null;
try{
new Thread(new Runnable() {
@Override
public void run() {
if(foo == null){
//Only Exception that can be thrown from a Runnable
throw new RuntimeException("F.U.B.A.R.");
}
}
}).start();
}catch(Exception ex){
//In my opinion the way to catch this Exception
System.out.println(ex.getMessage());
}
}
我期望看到的输出是:
F.U.B.A.R。的
我得到的输出:
线程“Thread-0”中的异常java.lang.RuntimeException:F.U.B.A.R。
我需要这个的原因是把这个Exception放到我自己的位置,所以我可以正确地使用它。
有谁知道如何获得预期的输出而不是当前的输出?
答案 0 :(得分:3)
因为在try和catch之间构造Runnable并执行.start()没有抛出异常。当线程执行“run”方法时,稍后引发运行时异常。
答案 1 :(得分:2)
当前的catch块在主线程上捕获异常,而在另一个线程上抛出异常。它不会起作用。你必须
run()
方法的主体答案 2 :(得分:1)
问题是由于两个线程。一个线程的例外不能被另一个线程捕获。
在您的情况下,您试图捕获主线程update table
set number = columnA * columnB,
var1 = columnA * columnB *
(case when lower(columnC) like '%aaa%' then 1
when lower(columnC) like '%bbb%' then 2
when lower(columnC) like '%ccc%' 4
else 1
end),
var2 = number / var1
var2 = (case when lower(columnC) like '%aaa%' then 1/1.0
when lower(columnC) like '%bbb%' then 1/2.0
when lower(columnC) like '%ccc%' 1/4.0
else 1.0
end);
启动线程时可能发生的异常
您需要捕获Thread-0
中的异常else
答案 3 :(得分:1)
正如我上面/下面的许多人所指出的那样,你试图在一个线程中捕获异常并且线程完全不同,这意味着default exception handler is catching and handling it。如果您愿意,可以更改它,但通常最好在您正在使用的线程中捕获异常并在那里处理它。
如果您需要两个线程相互通信,那么您有几个选项,例如生成的线程捕获异常并将传递传递给使用ExecutorService,调用get Future 3}}并查看它是否会抛出ExecutionException。
您提到过您正在使用TimerTask。如果您可以转到ScheduledThreadPoolExecutor,那么您可以使用Future方法。如果没有,那么你将不得不捕获TimerTask的异常,如果失败则返回主线程。