我正在使用一个创建自己的线程的库,它会抛出异常。我怎么能抓住那个例外?在下面标记的行上抛出异常:
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());
}
}
答案 0 :(得分:17)
如果你无法抓住它可能会对你有所帮助:
如果您拥有Thread
对象,则可以尝试设置UncaughtExceptionHandler。
看看Thread.setUncaughtExceptionHandler(...)。
向我们提供有关您使用的库以及如何使用它的更多详细信息。
答案 1 :(得分:5)
如果你拥有的只是一个Thread
对象,那么就无法捕获任何异常(我假设它是RuntimeException
)。执行此操作的正确方法是使用Future<?>
使用的ExecutorService
类,但您无法控制从我假设的Thread
开始的代码。
如果您要提供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();
}
另外,正如@Ortwin所提到的,如果你要分支自己的线程,你也可以设置未捕获的异常处理程序:
thread.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
public void uncaughtException(Thread t, Throwable e) {
// log it, dump it to the console, or ...
}
});
但是如果库中的线程代码无法被你包裹,那么这将无效。如果您编辑问题并显示一些代码并提供更多详细信息,我可以编辑我的问题以提供更好的帮助。