如何捕获Java中另一个线程引发的异常?

如何捕获Java中另一个线程引发的异常?,java,multithreading,exception-handling,Java,Multithreading,Exception Handling,我正在使用一个创建自己线程的库,它会抛出一个异常。我怎样才能抓住那个例外?在下面标记的行上引发异常: ResourceDescriptor rd = new ResourceDescriptor(); rd.setWsType(ResourceDescriptor.TYPE_FOLDER); fullUri += "/" + token; System.out.println(fullUri); // >>> EX

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

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());
            }
        }
ResourceDescriptor rd=新的ResourceDescriptor();
rd.setWsType(ResourceDescriptor.TYPE_文件夹);
fullUri+=“/”+令牌;
System.out.println(fullUri);

//>>>下一行抛出异常如果您只有一个
线程
对象,则无法捕获任何异常(我假设是
运行时异常
)。正确的方法是使用
ExecutorService
使用的
Future
类,但您无法控制启动
线程的代码

如果您正在提供
可运行的
,或者如果您正在将任何代码注入库中,那么您可以将其封装在一个类中,该类可以捕获并保存
异常
,但这仅限于异常在您的代码中或从您调用的代码中抛出的情况。如下所示:

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

但是,如果库中的线程代码不能由您包装,那么这将不起作用。如果您编辑您的问题,并显示一些代码和提供更多详细信息,我可以编辑我的问题以提供更好的帮助。

如果您听不懂,可能这对您有帮助:

如果您有
线程
对象,您可以尝试设置一个线程。 看一看


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

如果您提供的是
线程
而不是
可运行
,则可以重写
连接
方法。这将允许您检查线程是否带异常退出,并在加入线程的上下文中重新抛出异常。@artbristol您是对的。这很不幸。目前我无法控制这个库,因为它已经编译好了。很好的解释。您能详细说明一下使用
Future
有什么帮助吗?
Future
允许您使用executor服务,但仍然会得到池@flow2k中线程抛出的异常。您如何调用抛出exeption的方法?(可能是:如何知道抛出了异常?)我已经尝试捕获泛型异常类,但仍然会抛出异常。我在谷歌上搜索了一下,它似乎是由我正在使用的库中的另一个线程抛出的。该库通过web服务与web应用程序交互。+1我不知道这一点。这比我的答案要好。我无法控制由我正在使用的库创建的线程,因此我无法在它们的线程上显式设置未捕获的异常处理程序。我该怎么办?看一看。这样您就可以获得
线程
对象;)这当然不是一个真正干净的解决方案,但值得一试。如果我发现了这个例外呢?我如何访问它(可能是通过代理)?
thread.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
   public void uncaughtException(Thread t, Throwable e) {
      // log it, dump it to the console, or ...
   }
});