2017-12-12 8 views
0

複数のタスクを並行して実行する繰り返しパターンがあり、いずれかが成功するか、そのいずれかが原因でプロセス全体が失敗します。私はプロセスが最初のタスク例外の直後に失敗したと判断することができますが、例外を報告する前にすべて終了するまで待つ必要があります。複数の例外を収集する方法として例外が発生しない

{ 
    List<Future<?>> futures = launchTasks(); 
    boolean anyProcessFailed = false; 

    for (Future<?> future: futures) 
     try { 
      future.get(); 
     } catch(ExecutionException ex) { 
      //This process failed 
      anyProcessFailed=true; 
     } 

    if (anyProcessFailed) throw new Exception(); 
} 

上記のコードは動作しますが、終了時にスローされた例外は、それを引き起こした例外(複数可)への参照を持っていない、これは、1つまたはすべてであってもよいです。

質問です:が例外の複数の原因の概念を実装するためにThrowable.addSuppressedを使用することをお勧めであるか、私はThrowable[] getCauses()を公開して自分のExceptionタイプを実装する必要がありますか?

公開されたAPIを持つ中で、抑制された例外は、try-with-resourcesステートメント中にJREによってのみ設定されることを意味しています。実際の試行リソースは普通の古い学校の文法的砂糖ですtry-finallyブロック

例1:次のコードは他のタスクが完了するのを待たず、他のスレッドは野生に残されます。

{ 
    List<Future<?>> futures = launchTasks(); 

    for (Future<?> future: futures) 
     try { 
      future.get(); 
     } catch(ExecutionException ex) { 
      //This process failed 
      throw new Exception(ex); 
     } 

} 

例2:それは意味のあるデータを持つことができます場合、私は現在、

{ 
    List<Future<?>> futures = launchTasks(); 
    Exception ex = new Exception(); 

    for (Future<?> future: futures) 
     try { 
      future.get(); 
     } catch(ExecutionException e) { 
      //This process failed 
      ex.addSuppressed(e); 
     } 

    if (ex.getSuppressed().length > 0) throw ex; 
} 

答えて

0

をやって何が一般的にそれはあなたのコードでは、本当に例外的なシナリオを表す独自の例外を実装することは常に良い習慣ですあなたのAPIの呼び出し元のために。それ以外の場合は、JDKの一般的な例外のいずれかを使用する方が良い選択です。私は、addSuperceededメソッドのJavaDocでは、JDKでのこのメソッドのサンプル使用法としてtry-finallyシナリオが挙げられていると思います。それが理にかなっていれば、もちろんあなたのシナリオに使うことができます。

0

質問:Throwable.addSuppressedを使用して例外の複数の原因を実装するか、Throwable [] getCauses()を公開する独自のException型を実装するのがよいでしょうか?

  1. 号これらの用語はJLSとThrowable APIで使用されているという意味で例外を「抑制」されません。
  2. はい、私はプロパティーcausesを呼び出しません。
+0

Exceptionの一般的な例は、一例に過ぎません。私はすでに特定の例外を持っています –

+0

例を書く良い方法があります... –

関連する問題