1

我的代码如下所示:

public static void startService() {
            try{
            new Thread(new Runnable() {
                @Override
                public void run() {
                    throw new RuntimeException("Some exception");
                }
            }).start();
            }catch (Exception e){
                //Exception handling
            }
        }

如何在父线程的 catch() 块中处理此异常? UPD:这个线程必须异步工作

4

5 回答 5

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
}
于 2013-07-04T10:14:25.850 回答
0

如果您的意思是它在 Runnable 的 run() 方法中,那么您将不得不使用另一种方法。改用 Callable !可调用的 call() 方法允许您返回一个值并引发异常。

请在此处查看有关如何使用Callable的示例。另外,请注意,最好使用更高级别的 api,例如 ExecutorService,它管理线程的生命周期并提供线程池。(包括在示例中)

于 2013-07-04T10:15:38.620 回答
0

你将不得不使用一个可调用的。

thread.run 方法永远不会抛出异常,因为它 - 很好 - 在不同的线程中执行,并且不会干扰您的调用线程。

如果你执行一个可调用对象(例如通过一个 ExecutorService 运行它),你会得到一个 Future 结果,这反过来会在调用 future.get() 方法时抛出给定的异常。

于 2013-07-04T10:19:54.493 回答
-1

在 catch 块中使用 throw 语句。

public static void startService() {
        try{
        new Thread(new Runnable() {
            @Override
            public void run() {

            }
        }).start();
        }catch (Exception e){
            throw e;
    }
}
于 2013-07-04T10:07:02.393 回答
-1

重新抛出异常只是throw ecatch块中添加

于 2013-07-04T10:06:41.083 回答