ミゲル・ガンボア:
Javaで非同期メソッドを開発CompletableFuture
、我々は結果のCFは、そのメソッドが成功したか失敗したかどうかに応じて、通常、または非常に完了することを期待戻り値の型。
しかし、私の方法はに書き込む例えば考えるAsynchronousChannel
と、例外開口部そのチャンネルを得ました。それも、書き込みを開始していません。したがって、この場合には、私はちょうど呼び出し元に例外フローをできるようにテンティングしています。あれは正しいですか?
呼び出し側は、2つの障害シナリオに対処する必要がありますが:1)例外、または2)の約束を拒否しました。
または代わりに、私のメソッドキャッチは例外とは、代わりに拒否された約束を返さなければならないこと?
ペドロ・フェリックス:
エラーを通信するための2つの異なるパスが存在しますので、IMO、オプション1)が使用するAPI難しくなります:
- メソッドがスローされる例外を終了し、「同期」の例外、。
- メソッドが例外を除いて完了したCFを、返す「非同期」の例外、。常に非同期パスが開始された後にエラーが発見されただけの状況を(例えばタイムアウト)が存在しますので、このケースを回避することは不可能であることに注意してください。
プログラマは今の代わりに一つだけの、両方のこれらの二つのパスが正しく処理されていることを確認する必要があります。
両方のC#とJavascriptのための行動は常にの体内に発生した例外を報告することであることを観察することも興味深いasync
返さ経由で機能をTask
/ Promise
、でも最初の前に発生した例外のためにawait
、決して終わることでasync
例外と関数呼び出しを。
使用した場合でも同じことが、Kotlinのコルーチンについても同様であるUnconfined
ディスパッチャを
class SynchronousExceptionExamples {
@Test
fun example() {
log.info("before launch")
val job = GlobalScope.launch(Dispatchers.Unconfined) {
log.info("before throw")
throw Exception("an-error")
}
log.info("after launch")
Thread.sleep(1000)
assertTrue(job.isCancelled)
}
}
生成されます
6 [main] INFO SynchronousExceptionExamples - before launch
73 [main @coroutine#1] INFO SynchronousExceptionExamples - before throw
(...)
90 [main] INFO SynchronousExceptionExamples - after launch
例外としてノートがで発生main
しかし、スレッドlaunch
適切で終わりますJob
。