7

独自のスレッドを作成するライブラリを使用していますが、例外がスローされます。どうすればその例外をキャッチできますか? 例外は、次の行でスローされます。

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());
            }
        }
4

2 に答える 2

21

キャッチできない場合は、次のことが役立ちます。

Threadオブジェクトがある場合は、 UncaughtExceptionHandlerの設定を試みることができます。Thread.setUncaughtExceptionHandler(...)を見てください。

使用しているライブラリとその使用方法について詳しく教えてください。

于 2012-04-27T14:19:12.003 に答える
7

あなたが持っているのが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();
}

また、独自のスレッドをフォークしている場合は、キャッチされていない例外ハンドラーを設定することもできます。

thread.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
   public void uncaughtException(Thread t, Throwable e) {
      // log it, dump it to the console, or ...
   }
});

ただし、ライブラリ内のスレッド コードをラップできない場合、それは機能しません。質問を編集してコードを表示し、さらに詳細を提供していただければ、質問を編集してより良いヘルプを提供できます。

于 2012-04-27T13:54:58.310 に答える