可能重复:
What is the best approach to handling exceptions thrown in a separate thread?
当坏事发生时,我的代码抛出一个异常,后来被捕获并处理。
如果所述代码作为线程的一部分运行,则public void run()
不会throw Exception
。胎面执行者如何知道抛出的异常?
现在:
A a = new A();
try {
a.doSomething();
} catch (Exception e) {
// do something clever
}
使用主题
Thread t = new Thread (new A());
t.start(); // run() calls doSomething()
如果此线程出现异常,我怎么知道呢?
答案 0 :(得分:6)
您可以通过Thread.setUncaughtExceptionHandler()在线程上设置未捕获的异常处理程序,它将处理代码中未处理的任何异常。
本质:
t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
public void uncaughtException(Thread t, Throwable e)() {
// do whatever
}
});
此外,如果你想要一个所有线程的处理程序,你可以调用Thread.setDefaultUncaughtExceptionHandler这是一个静态方法,为没有专门用于它的线程提供一个处理程序。
答案 1 :(得分:4)
您可以捕获异常 in-thread ,然后将其作为事件传递给创建者线程。
答案 2 :(得分:2)
您可以使用ExecutorService
ExecutorService es =
Future<Type> future = ex.submit(new Callable<Type>() {
public Type call() throws Exception {
// do something
return result;
}
});
// later
try {
Type result = future.get();
} catch(ExecutionException e) {
Throwable exceptionThrown = e.getCause();
}
如果您没有任何要返回的内容,可以使用以下内容。
Future<Void> future = ex.submit(new Callable<Void>() {
public Void call() throws SpecificException {
// do something which might throw SpecificException
return null;
}
});