Kotlinの例外処理とキャンセルの連携を完全ガイド!初心者でもわかるCoroutineExceptionHandlerの使い方
生徒
「Kotlinのコルーチンで、エラーが発生したときにキャンセルされたりして混乱してます…。どうやってエラー処理するのが正しいんですか?」
先生
「それはCoroutineExceptionHandlerを使うと、うまく例外処理とキャンセルを連携できますよ。非同期処理でのエラーは見えづらいので、ちゃんとキャッチする方法が必要なんです。」
生徒
「CoroutineExceptionHandlerってなんですか?初心者でも使えますか?」
先生
「もちろん!わかりやすく例を交えて解説していきましょう!」
1. 非同期処理と例外の関係とは?
通常のKotlinコードでは、エラーが出たときにtry-catchで対応できますが、非同期処理(コルーチン)ではlaunchの中で発生したエラーがメインスレッドに伝わらないことがあります。
そのため、例外が発生しても気づかずにプログラムが止まることも…。これを防ぐのがCoroutineExceptionHandlerです。
2. CoroutineExceptionHandlerとは?
CoroutineExceptionHandlerは、Kotlinの非同期処理で発生した「予期しないエラー」を安全に処理するための仕組みです。
launchなどでコルーチンを起動したとき、内部でエラーが起きた場合でも、このハンドラーがあれば処理を中断せずに、エラーメッセージを記録したり、他の処理に影響を与えずに済ませたりできます。
3. 基本の使い方を見てみよう
まずはシンプルな例でCoroutineExceptionHandlerを使ってみましょう。
import kotlinx.coroutines.*
fun main() = runBlocking {
val handler = CoroutineExceptionHandler { _, exception ->
println("エラーをキャッチしました: ${exception.message}")
}
val job = launch(handler) {
throw RuntimeException("故意のエラーです")
}
job.join()
}
Kotlinを基礎からしっかり学びたい人や、 Java経験を活かしてモダンな言語にステップアップしたい人には、 定番の入門書がこちらです。
基礎からわかるKotlinをAmazonで見る※ Amazon広告リンク
4. 実行結果の確認
エラーをキャッチしました: 故意のエラーです
このように、コルーチンの中でエラーが起きてもCoroutineExceptionHandlerがちゃんと対応してくれます。
5. キャンセルと例外処理の関係
コルーチンでは、ある1つの処理が失敗すると、他の処理も「キャンセル(中断)」されることがあります。これは構造化同時実行の仕組みによるものです。
でも、すべての処理が巻き添えになるのは困る場合もありますよね。そういうときはsupervisorScopeを使って、エラーが出ても他の処理を止めないようにします。
6. エラーとキャンセルを連携して処理する例
次は、CoroutineExceptionHandlerとsupervisorScopeを組み合わせた例です。
fun main() = runBlocking {
val handler = CoroutineExceptionHandler { _, exception ->
println("ハンドラーで捕捉: ${exception.message}")
}
supervisorScope {
launch(handler) {
delay(300)
throw RuntimeException("エラー発生!")
}
launch {
repeat(5) {
delay(100)
println("処理中... $it")
}
}
}
}
7. 実行結果の確認
処理中... 0
処理中... 1
ハンドラーで捕捉: エラー発生!
処理中... 2
処理中... 3
処理中... 4
このように、片方の処理でエラーが起きても、もう片方の処理はキャンセルされずに続いています。
8. どんなときに使うの?
CoroutineExceptionHandlerは、次のような場面で非常に役立ちます:
- ログにエラーメッセージを出して原因を追いたいとき
- ユーザーにエラー通知を表示したいとき
- エラーが出ても他の処理は続けたいとき
非同期処理の失敗は目に見えにくいため、ハンドラーでしっかり対応することが大切です。
9. 初心者が覚えておきたい例外処理のポイント
- 非同期処理ではエラーが見えにくい
CoroutineExceptionHandlerでエラー処理を見える化supervisorScopeを使えば、他の処理を止めずに済む- ログ・通知・デバッグにも活用できる
Kotlinの非同期プログラミングで失敗しないためには、例外処理とキャンセル処理を正しく理解し、適切に連携させることがとても重要です。