Java 如何重新抛出异常以捕获另一个线程中的块

Java 如何重新抛出异常以捕获另一个线程中的块,java,multithreading,exception,Java,Multithreading,Exception,我的代码如下所示: public static void startService() { try{ new Thread(new Runnable() { @Override public void run() { throw new RuntimeException("Some exception"); }

我的代码如下所示:

public static void startService() {
            try{
            new Thread(new Runnable() {
                @Override
                public void run() {
                    throw new RuntimeException("Some exception");
                }
            }).start();
            }catch (Exception e){
                //Exception handling
            }
        }
如何在parrent线程的catch()块中处理此异常?
UPD:此线程必须异步工作重试异常只是在
catch
块中添加
throw e
重试异常只是在
catch
块中添加
throw e
使用catch块中的throw语句

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

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

在catch块中使用throw语句

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

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

您有几个选项来处理线程引发的异常。一种是要有一个通用的未捕获异常处理程序:

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
}
ExecutorService executor=Executors.newCachedThreadPool();
Future=executor.submit(new Runnable()){
@凌驾
公开募捐{
抛出新的RuntimeException(“某些异常”);
}
});
试一试{
future.get();
}捕获(执行例外){
Throwable yourException=e.getCause();//在这里可以访问异常
}

您有几个选项来处理线程引发的异常。一种是要有一个通用的未捕获异常处理程序:

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
}
ExecutorService executor=Executors.newCachedThreadPool();
Future=executor.submit(new Runnable()){
@凌驾
公开募捐{
抛出新的RuntimeException(“某些异常”);
}
});
试一试{
future.get();
}捕获(执行例外){
Throwable yourException=e.getCause();//在这里可以访问异常
}

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


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

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


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

您必须使用可调用的

run方法永远不会抛出异常,因为它在不同的线程中执行得很好,并且在这种情况下不会干扰调用线程


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

您必须使用一个可调用的

run方法永远不会抛出异常,因为它在不同的线程中执行得很好,并且在这种情况下不会干扰调用线程


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

请看一看,您必须意识到
new Thread()
start()
不太可能抛出异常。然后启动一个并行线程并调用
run
。通过异常处理程序可以通知您。请看一看,您必须意识到
new Thread()
.start()
不太可能引发异常。然后启动一个并行线程并调用
run
。通过异常处理程序可以通知您。我想问题是:如何从父线程中重新引发子线程引发的异常。我想问题是:如何从父线程中重新引发子线程引发的异常。downvote意味着我在解释线程时犯了一些错误,你能让我知道吗?为了恢复损失,其他人也收到了没有解释的否决票。你不能用你描述的方法从主线程捕获在可运行运行的运行方法中抛出的异常。@assylias,谢谢:)这是一个新东西。编辑了我的答案same@PrasadKharkar恐怕你的回答仍然不能回答我提出的问题。你所说的大体上是正确的,但不适用于本文中描述的具体情况。downvote表示我在解释线程时犯了一些错误,你能告诉我吗?UpVote恢复了损坏,其他人也收到了未经解释的否决票。您无法使用您描述的方法从主线程捕获Runnable run方法中抛出的异常。@assylias,谢谢:)这是一件需要学习的新事物。编辑了我的答案same@PrasadKharkar恐怕你的回答仍然不能回答我提出的问题。你所说的一般来说是正确的,但不适用于本文所描述的具体情况。对不起,我没有提到我需要异步做这件事。方法get()是同步的。很好,你可以让get()方法在它自己的线程中运行,然后注册一个监听器。对不起,我没有提到我需要异步执行它。方法get()是同步的,可以让get()方法在自己的线程中运行,然后注册一个侦听器