Kotlinコルーチンでtry-catchしたらcatchに落ちないでクラッシュした件
よく界隈で言われてるのがKotlinではあまりtry-catchを書かないみたいな事を聞くのですが、Java的な書き方もできてしまうのと、Kotlin自体がJavaと共存できてしまうことからtry-catch的な書き方もされていることが多々あったりします。
Kotlinコルーチンとは
Javaのようなマルチスレッドでの非同期処理もできますが、基本的にはKotlinコルーチンを推奨。
今回の現象
lifecycleScope.launch {
try {
async {
// 例外に落ちるかもしれない処理
}
} catch (exception: Exception) {
Log.d(TAG, "落ちたのをログで確認したい${exception.message}")
}
}
みたいなコードを書くとキャッチに落ちずにAndroidの場合はそのまま例外でクラッシュします。asyncの内部がキャッチされないらしい。
ただブレイクポイントを貼って確認してるとキャッチに落ちてるように見える。
キャッチに落ちてるように見えるのにキャッチで拾えずに落ちる。コルーチンの処理内でブレイクポイント貼っても正常にログが拾えないこともあるらしいので普通にキャッチに落ちてないんだと思う。
try-catchをそのまま使いたい場合
lifecycleScope.launch {
try {
coroutineScope {
async {
// 例外に落ちるかもしれないの処理
}
}
} catch (exception: Exception) {
Log.d(TAG, "落ちたのをログで確認したい${exception.message}")
}
}
try-catchの中でcoroutineScopeでラップする。
まとめ
今回の現象と解決方法はありますが、そもそもCoroutineであまりtry、catchをすること自体よくなさそう。
CoroutineExceptionHandlerだったりを使った方が良さそうです。