如何在另一个线程中重新抛出异常以捕获块

时间:2013-07-04 10:04:52

标签: java multithreading exception

我的代码看起来像这样:

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 :此线程必须异步工作

5 个答案:

答案 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;
    }
}