如何访问作为线程的一部分发生的异常信息?

时间:2012-01-10 15:52:43

标签: java multithreading exception

  

可能重复:
  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()

如果此线程出现异常,我怎么知道呢?

3 个答案:

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