【问题标题】:How to re-throw an exception to catch-block in another thread如何重新抛出异常以在另一个线程中捕获块
【发布时间】:2013-07-04 10:04:51
【问题描述】:

我的代码如下所示:

public static void startService() {
            try{
            new Thread(new Runnable() {
                @Override
                public void run() {
                    throw new RuntimeException("Some exception");
                }
            }).start();
            }catch (Exception e){
                //Exception handling
            }
        }

如何在父线程的 catch() 块中处理此异常? UPD:这个线程必须异步工作

【问题讨论】:

  • 必须意识到new Thread().start() 不太可能抛出异常。然后启动一个并行线程并调用run。通过异常处理程序可以通知您。

标签: java multithreading exception


【解决方案1】:

在 catch 块中使用 throw 语句。

public static void startService() {
        try{
        new Thread(new Runnable() {
            @Override
            public void run() {

            }
        }).start();
        }catch (Exception e){
            throw e;
    }
}

【讨论】:

  • 我认为问题是:如何从父线程重新抛出子线程抛出的异常。
【解决方案2】:

重新抛出异常只是在catch块中添加throw e

【讨论】:

  • downvote 表示我在解释线程时犯了一些错误,你能告诉我吗?
  • 赞成恢复损坏,其他人也收到了不加解释的反对票
  • 用你描述的方法无法从主线程捕获Runnable运行的方法中抛出的异常。
  • @assylias,谢谢你 :) 那是要学习的新东西。编辑了我的答案
  • @PrasadKharkar 您的回答仍然没有回答我提出的问题。您所说的总体上是正确的,但不适用于本文中描述的具体情况。
【解决方案3】:

您有多种选择来处理线程抛出的异常。一种是有一个通用的未捕获异常处理程序:

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        //log the exception or handle it here if possible
    }
});

但是很难将通过这种方式捕获的异常与特定线程联系起来。

或者您可以使用 ExecutorService 而不是手动启动线程:

ExecutorService executor = Executors.newCachedThreadPool();
Future<?> future = executor.submit(new Runnable() {
    @Override
    public void run() {
        throw new RuntimeException("Some exception");
    }
});

try {
   future.get();
} catch (ExecutionException e) {
    Throwable yourException = e.getCause(); //here you can access the exception
}

【讨论】:

  • 对不起,我没有提到我需要异步执行。并且方法 get() 是同步的。
  • 没关系,你可以让get()方法在自己的线程中运行,然后注册一个监听器
【解决方案4】:

如果你的意思是它在 Runnable 的 run() 方法中,那么你将不得不使用另一种方法。改用 Callable !可调用的 call() 方法允许您返回一个值并引发异常。

请在此处查看有关如何使用Callable 的示例。另外,请注意,最好使用更高级别的 api,例如 ExecutorService,它管理线程的生命周期并提供线程池。 (包含在示例中)

【讨论】:

    【解决方案5】:

    你必须使用 Callable。

    thread.run 方法永远不会抛出异常,因为它在另一个线程中很好地执行,并且不会干扰您的调用线程。

    如果您执行一个可调用对象(例如通过 ExecutorService 运行它),您会得到一个 Future 结果,该结果反过来会在调用 future.get() 方法时抛出给定的异常。

    【讨论】:

      猜你喜欢
      • 2012-05-08
      • 2011-06-25
      • 2022-01-09
      • 1970-01-01
      • 2012-02-10
      • 2010-10-03
      • 2013-11-15
      • 2021-04-01
      • 1970-01-01
      相关资源
      最近更新 更多