如何捕获Java中另一个线程抛出的异常?

时间:2012-04-27 13:51:56

标签: java multithreading exception-handling

我正在使用一个创建自己的线程的库,它会抛出异常。我怎么能抓住那个例外?在下面标记的行上抛出异常:

ResourceDescriptor rd = new ResourceDescriptor();
        rd.setWsType(ResourceDescriptor.TYPE_FOLDER);
        fullUri += "/" + token;
        System.out.println(fullUri);
        // >>> EXCEPTION THROWN ON THE FOLLOWING LINE <<<
        rd.setUriString(fullUri.replaceAll("_", ""));
        try{
            rd = server.getWSClient().get(rd, null);
        }catch(Exception e){
            if(e.getMessage().contains("resource was not found")){
                this.addFolder(fullUri, label, false);
                System.out.println("Folder does not exist, will be added now.");
            }else{
                System.out.println("Error Messages: " + e.getMessage());
            }
        }

2 个答案:

答案 0 :(得分:17)

如果你无法抓住它可能会对你有所帮助:

如果您拥有Thread对象,则可以尝试设置UncaughtExceptionHandler。 看看Thread.setUncaughtExceptionHandler(...)

向我们提供有关您使用的库以及如何使用它的更多详细信息。

答案 1 :(得分:5)

如果你拥有的只是一个Thread对象,那么就无法捕获任何异常(我假设它是RuntimeException)。执行此操作的正确方法是使用Future<?>使用的ExecutorService类,但您无法控制从我假设的Thread开始的代码。

如果您要提供Runnable或者您正在将任何代码注入库中,那么您可以将其包装在一个为您捕获并保存Exception的类中,但这只是如果异常在您的代码中或从您调用的代码中抛出。如下所示:

final AtomicReference<Exception> exception = new AtomicReference<Exception>();
Thread thread = library.someMethod(new Runnable() {
   public void run() {
      try {
         // call a bunch of code that might throw
      } catch (Exception e) {
         // store our exception thrown by the inner thread
         exception.set(e);
      }
   }
});
// we assume the library starts the thread
// wait for the thread to finish somehow, maybe call library.join()
thread.join();
if (exception.get() != null) {
   throw exception.get();
}

另外,正如@Ortwin所提到的,如果你要分支自己的线程,你也可以设置未捕获的异常处理程序:

thread.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
   public void uncaughtException(Thread t, Throwable e) {
      // log it, dump it to the console, or ...
   }
});

但是如果库中的线程代码无法被你包裹,那么这将无效。如果您编辑问题并显示一些代码并提供更多详细信息,我可以编辑我的问题以提供更好的帮助。