📱
Kotlinコルーチンでtry-catchしたらcatchに落ちないでクラッシュした件
よく界隈で言われてるのがKotlinではあまりtry-catchを書かないみたいな事を聞くのですが、Java的な書き方もできてしまうのと、Kotlin自体がJavaと共存できてしまうことからtry-catch的な書き方もされていることが多々あったりします。
Kotlinコルーチンとは
コルーチンとは、Android で使用できる並行実行のデザイン パターンです。これを使用すると、非同期実行するコードを簡略化できます。コルーチンは、Kotlin にはバージョン 1.3 で追加されたものですが、すでに他の言語で確立されている概念をベースにしています。
引用元: https://developer.android.com/kotlin/coroutines?hl=ja
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でラップする。
Discussion