当前位置: 首页 > 知识库问答 >
问题:

如何在Java中捕捉另一个线程引发的异常?[副本]

狄睿
2023-03-14

我使用的是一个创建自己线程的库,它引发了一个异常。如何捕捉异常?异常在下面标记的行上引发:

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个答案

皇甫学海
2023-03-14

如果只有一个Thread对象,那么就无法捕获任何异常(我假定是RuntimeException)。正确的方法是使用ExecutorService使用的Future<?>类,但我认为您无法控制启动线程的代码。

如果您正在提供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();
}

此外,如果您正在分叉自己的线程,还可以设置未捕获的异常处理程序:

thread.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
   public void uncaughtException(Thread t, Throwable e) {
      // log it, dump it to the console, or ...
   }
});
 类似资料:
  • 问题内容: 我正在尝试编写一个使用PyQt5在系统托盘中运行的应用程序。该代码有时会引发异常,我需要能够捕获它们。 我希望当应用程序中发生异常时,会退出主事件循环,因此像这样捕获它应该起作用: 在下面的示例中,当我按下“提高”按钮时,我仅看到回溯,但从未看到打印过的内容。 有2个类似的问题,但是那里的答案并没有满足我的需要: 抓住PyQt中的任何异常:OP希望 监视 异常,不退出偶数循环。 防止P

  • 本文向大家介绍Java多线程之多线程异常捕捉,包括了Java多线程之多线程异常捕捉的使用技巧和注意事项,需要的朋友参考一下   一:为什么要单独讲多线程的异常捕捉呢? 先看个例子:   在run中手动抛出了一个运行时异常,在main中启动线程,catch语句块中捕捉下异常,捕捉到打印一句话。运行结果如下图:   发现异常被抛到了控制台,没有打印catch块中的语句。   结论:多线程运行不能按照顺

  • 例子: 我如何在mockito中执行此操作,并在强制抛出异常1后验证是否得到了异常2?

  • 然后我把它用作: 但是最后一行代码没有捕获任何异常,我的代码给出运行时异常并停止。你能解释为什么会发生这种情况,如果可能的话,如何修复它吗?

  • 问题内容: 我们希望在应用程序日志中跟踪这些异常-默认情况下,Java只会将它们输出到控制台。 问题答案: 在EDT中和EDT外,未捕获的异常之间存在区别。 另一个问题有一个解决方案,但是如果您只想咀嚼EDT部分的话…

  • 问题内容: 我想捕获一个异常,该异常嵌套在另一个异常中。我目前正在这种方式: 有没有一种方法可以使此操作更高效,更优雅? 问题答案: 没有更优雅的方法来选择性地“捕获”嵌套异常。我想如果您做了很多这样的嵌套异常,就可以将代码重构为通用的实用程序方法。但是它仍然不会优雅或高效。 优雅的解决方案是消除异常嵌套。要么不首先将异常链接起来,要么(有选择地)解开包装并将嵌套的异常重新扔到堆栈的上方。 嵌套异