如何捕获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 ...
}
});