2012-04-27 70 views
4

我正在使用一个库创建自己的线程,并引发异常。我怎样才能捕捉到这个异常?抛出异常下面标注一行:如何捕获Java中另一个线程抛出的异常?

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()); 
      } 
     } 
+1

你如何调用抛出豁免的方法? (可能是:如何知道异常抛出?) – DerMike 2012-04-27 14:19:12

+0

我已经尝试捕获泛型异常类,但我仍然得到异常抛出。我GOOGLE了它,似乎是从我正在使用的库中的另一个线程抛出。该库通过Web服务与Web应用程序进行交互。 – yuejdesigner85 2012-04-27 15:01:19

回答

5

如果你已经是一个Thread对象那么有没有办法赶上任何异常(我假设是RuntimeException)。执行此操作的正确方法是使用ExecutorService使用的Future<?>类,但您无法控制我假设的开始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 ... 
    } 
}); 

但是,如果内部的线程代码图书馆不能被你包装,那么这是行不通的。如果您编辑问题并显示一些代码并提供更多详细信息,我可以编辑我的问题以提供更好的帮助。

+0

如果你提供了一个'Thread'而不是'Runnable',你可以重载'join'方法。这将允许您检查线程是否退出异常,并在连接线程的上下文中重新抛出异常。 – ccurtsinger 2012-04-27 14:12:59

+0

@ccurtsinger'加入'是最后的 – artbristol 2012-04-27 14:15:38

+0

@artbristol你​​是对的。那真不幸。 – ccurtsinger 2012-04-27 14:20:20

16

如果你不能抓住它或许可以帮助你:

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

给我们一些关于您使用的库以及如何使用它的更多细节。

+3

+1我不知道这件事。这比我的答案要好。 – Gray 2012-04-27 17:23:09

+0

我没有任何控制由我使用的库创建的线程,所以我不能明确地在其线程上设置未捕获的异常处理程序。我该怎么办? – yuejdesigner85 2012-05-03 14:36:53

+0

看看[这里](http://stackoverflow.com/questions/1323408/get-a-list-of-all-threads-currently-running-in-java)。这样你就可以控制'Thread'对象;)它当然不是一个干净的解决方案,但值得一试。 – 2012-05-03 16:58:38

相关问题