CompletableFutureからの例外投下
質問
次のようなコードがあります。
// How to throw the ServerException?
public void myFunc() throws ServerException{
// Some code
CompletableFuture<A> a = CompletableFuture.supplyAsync(() -> {
try {
return someObj.someFunc();
} catch(ServerException ex) {
// throw ex; gives an error here.
}
}));
// Some code
}
someFunc()
を投げる
ServerException
. ここでこれを処理せずに、例外をスローするのは
someFunc()
の呼び出し元に対して
myFunc()
.
どのように解決するのですか?
あなたのコードでは、非同期操作の結果を同じメソッド内で後で使っているようなので、その場合は
CompletionException
いずれにせよ、これを処理する一つの方法は
public void myFunc() throws ServerException {
// Some code
CompletableFuture<A> a = CompletableFuture.supplyAsync(() -> {
try { return someObj.someFunc(); }
catch(ServerException ex) { throw new CompletionException(ex); }
});
// Some code running in parallel to someFunc()
A resultOfA;
try {
resultOfA = a.join();
}
catch(CompletionException ex) {
try {
throw ex.getCause();
}
catch(Error|RuntimeException|ServerException possible) {
throw possible;
}
catch(Throwable impossible) {
throw new AssertionError(impossible);
}
}
// some code using resultOfA
}
の非同期処理の内部で投げられた全ての例外は、その例外が発生した時点で終了します。
Supplier
の中で発生した例外は
CompletionException
を呼び出すと
join
を除いて
ServerException
を除いて、すでに
CompletionException
.
の原因を投げ直すと
CompletionException
のサブクラスなど、チェックされていない例外に直面する可能性があります。
Error
または
RuntimeException
または、カスタムチェックした例外
ServerException
. 上記のコードでは、これらすべてをマルチキャッチで処理し、再スローしています。の戻り値の型が宣言されているので
getCause()
は
Throwable
である場合、コンパイラはすでにすべての可能な型を処理しているにもかかわらず、その型を処理するように要求します。簡単な解決策は、この実際に不可能な throwable を
AssertionError
.
別の方法として、カスタム例外のために別の結果未来を使用することもできます。
public void myFunc() throws ServerException {
// Some code
CompletableFuture<ServerException> exception = new CompletableFuture<>();
CompletableFuture<A> a = CompletableFuture.supplyAsync(() -> {
try { return someObj.someFunc(); }
catch(ServerException ex) {
exception.complete(ex);
throw new CompletionException(ex);
}
});
// Some code running in parallel to someFunc()
A resultOfA;
try {
resultOfA = a.join();
}
catch(CompletionException ex) {
if(exception.isDone()) throw exception.join();
throw ex;
}
// some code using resultOfA
}
この解決策は、すべての「予期しない」投げ物をラップされた状態で投げ直しますが、カスタムの
ServerException
を介して渡された元のフォームの
exception
を介して渡された元の形である。注意することは
a
が完了したことを確認する必要があります (例えば
join()
を最初に呼ぶようなもの) が完了したら、その前に
exception
に問い合わせる前に、レースコンディションを回避するために
関連
-
アノテーション「@Retention」の役割
-
XXX型を囲むインスタンスがJavaでアクセスできない
-
[解決済み] 配列からArrayListを作成する
-
[解決済み] Pythonで例外を手動で発生(スロー)させる
-
[解決済み] JUnit 4のテストで、ある例外が投げられたことをどのように断言しますか?
-
[解決済み] コレクションを反復処理し、ループ内でオブジェクトを削除する際に ConcurrentModificationException を回避する。
-
[解決済み] Mockitoでvoidメソッドをモックする方法
-
[解決済み] Javaでファイルが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み】C#で例外をキャッチして再スローする理由とは?
-
[解決済み】Exceptionを投げるとき、どの部分が高価なのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Eclipseは、ポップアップA Java Exception has occurred.を実行し、エラーException in threadの解決策を報告します。
-
Eclipse問題 アクセス制限。タイプ 'SunJCE' が API でないことを解決し、/jdk ディレクトリにある /jre と jre の違いについて理解を深める。
-
undefined[sonar] sonar:デフォルトのスキャンルール
-
アクセス制限です。タイプ 'JPEGCodec' は API ではない ☞My Blog Github ☜ ホームページを見る
-
executeQuery()でデータ操作文が発行できない。解決方法
-
SLF4J: クラス・パスに複数のSLF4Jバインディングが含まれています。
-
java.sql.SQLException: 結果セットの開始前
-
List list = new ArrayList(); Error: ArrayList は型に解決できません。
-
X11 DISPLAY変数が設定されていない」問題の解決方法
-
CAS 5.1.8でhttpをサポートし、認証されていない認可サービスエラーのプロンプトが表示される問題を解決した。