例外ハンドラと失敗の伝搬
コルーチンのエラーハンドリングは, めんどうくさい.
CoroutineExceptionHandler¶
公式リファレンスに
Exception Handling and Supervision
CoroutineExceptionHandler context element on a root coroutine can be used as generic catch block for this root coroutine and all its children where custom exception handling may take place
とあるように CoroutineExceptionHandler
は, ルートのコルーチンに子コルーチンの投げた例外をハンドリングさせるために使う.
デフォルトだと, Thread.uncaughtExceptionHandler
が使われて1
Exception in thread "DefaultDispatcher-worker-2 @coroutine#2" java.lang.IndexOutOfBoundsException
のような標準出力がされるのみで, エラーに気づけない.
CoroutineExceptionHandler
は ServiceLoader
経由でも設定できる23ので, ちゃんとアプリケーションのロガーで WARN か ERROR が残るようにしておくとよい.
CancellationException¶
同じのスコープのコルーチンの失敗などによってコルーチンがキャンセルされると, CancellationException
が投げられる.
このとき, 終了処理などハンドリングが必要なら, ちゃんと try-catch
か try-finally
を書かないといけない.
このハンドリングに, CoroutineExceptionHandler
は使えないのも注意.
こんなスクリプトを動かしてみると, なんとなく分かる.
-
https://github.com/Kotlin/kotlinx.coroutines/blob/1.3.7/kotlinx-coroutines-core/jvm/src/CoroutineExceptionHandlerImpl.kt#L39 ↩
-
https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-exception-handler/index.html ↩
-
https://github.com/Kotlin/kotlinx.coroutines/blob/1.3.7/kotlinx-coroutines-core/jvm/src/CoroutineExceptionHandlerImpl.kt#L25-L40 ↩
Last update: 2021-03-02