見出し画像

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でラップする。

まとめ

今回の現象と解決方法はありますが、そもそもCoroutineであまりtry、catchをすること自体よくなさそう。
CoroutineExceptionHandlerだったりを使った方が良さそうです。

参考 


この記事が気に入ったらサポートをしてみませんか?