複数のタスクを並行して実行する繰り返しパターンがあり、いずれかが成功するか、そのいずれかが原因でプロセス全体が失敗します。私はプロセスが最初のタスク例外の直後に失敗したと判断することができますが、例外を報告する前にすべて終了するまで待つ必要があります。複数の例外を収集する方法として例外が発生しない
{
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;
}
Exceptionの一般的な例は、一例に過ぎません。私はすでに特定の例外を持っています –
例を書く良い方法があります... –