我的代码看起来像这样:
public static void startService() {
try{
new Thread(new Runnable() {
@Override
public void run() {
throw new RuntimeException("Some exception");
}
}).start();
}catch (Exception e){
//Exception handling
}
}
如何在parrent线程的catch()块中处理此异常? UPD :此线程必须异步工作
答案 0 :(得分:2)
您有几个选项来处理线程抛出的异常。一种是拥有一般的未捕获异常处理程序:
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
//log the exception or handle it here if possible
}
});
但是很难将这种方式的异常与特定的线程联系起来。
或者您可以使用ExecutorService而不是手动启动线程:
ExecutorService executor = Executors.newCachedThreadPool();
Future<?> future = executor.submit(new Runnable() {
@Override
public void run() {
throw new RuntimeException("Some exception");
}
});
try {
future.get();
} catch (ExecutionException e) {
Throwable yourException = e.getCause(); //here you can access the exception
}
答案 1 :(得分:0)
重新抛出异常只是在throw e
块
catch
答案 2 :(得分:0)
如果你的意思是它在Runnable的run()方法中,那么你将不得不使用另一种方法。使用Callable代替! Callable call()方法允许您返回一个值并抛出异常。
请点击此处查看有关如何使用Callable的示例。另外,请注意最好使用更高级别的api,例如ExecutorService,它管理线程的生命周期并提供线程池。 (包括在示例中)
答案 3 :(得分:0)
你必须使用Callable。
thread.run方法永远不会抛出异常,因为它很好地在另一个线程中执行,并且这不会干扰你的调用线程。
如果你执行一个callable(例如通过ExecutorService运行它),你会得到一个Future结果,而这个结果在调用future.get()方法时会抛出给定的异常。
答案 4 :(得分:-1)
在catch块中使用throw语句。
public static void startService() {
try{
new Thread(new Runnable() {
@Override
public void run() {
}
}).start();
}catch (Exception e){
throw e;
}
}