Kotlinの非同期処理でエラーを安全に扱う!初心者でもわかるtry-catchの基本
生徒
「Kotlinの非同期処理って便利そうだけど、失敗したときのエラーってどうやって処理するんですか?」
先生
「いい質問ですね。Kotlinではtry-catchを使ってエラー処理ができます。非同期処理でも同じように使えるんですよ。」
生徒
「普通のtry-catchと何が違うんですか?」
先生
「非同期処理では、suspend関数やlaunchなどを使っているので、書き方に少し工夫が必要です。順番に見ていきましょう!」
1. Kotlinの非同期処理とエラーの関係
Kotlinでは、非同期処理を行うときにコルーチン(Coroutine)をよく使います。これは、時間がかかる処理を別のスレッドで実行するためのしくみです。たとえば、ネットからデータを取ってくる、ファイルを読み書きするなどが該当します。
こういった処理は、途中で失敗することがあります。たとえば、ネットがつながっていなかったり、ファイルが見つからなかったりしたときです。そのときに、try-catchでエラーをうまく処理しないと、アプリが強制終了してしまいます。
2. 非同期処理でのtry-catchの基本形
まずは、非同期処理をtry-catchで包む基本的な例を見てみましょう。
import kotlinx.coroutines.*
fun main() = runBlocking {
try {
val result = fetchData()
println("取得結果:$result")
} catch (e: Exception) {
println("エラーが発生しました:${e.message}")
}
}
suspend fun fetchData(): String {
delay(1000)
throw RuntimeException("通信に失敗しました")
}
3. 実行結果
上のコードを実行すると、以下のようなエラー処理がされます。
エラーが発生しました:通信に失敗しました
4. launchとasyncの違いに注意しよう
Kotlinの非同期処理ではlaunchとasyncという2つの方法があります。これらはエラー処理のタイミングが違うので注意が必要です。
- launch:エラーはコルーチンの中で発生するので、
CoroutineExceptionHandlerなどを使う必要があります。 - async:
await()を呼んだときにエラーが発生するので、try-catchで包めばOKです。
5. asyncでのエラー処理の実例
次に、asyncを使って非同期処理を行い、try-catchでエラーを扱う例です。
fun main() = runBlocking {
val deferred = async {
riskyOperation()
}
try {
val result = deferred.await()
println("成功:$result")
} catch (e: Exception) {
println("非同期処理でエラー:${e.message}")
}
}
suspend fun riskyOperation(): String {
delay(500)
throw IllegalStateException("処理中に問題が発生しました")
}
6. launchでのエラー処理には注意が必要
launchを使うと、try-catchだけではエラーを補足できません。別の方法で対処が必要ですが、ここではlaunchにtry-catchを書いても効かない例を紹介します。
fun main() = runBlocking {
launch {
try {
throwException()
} catch (e: Exception) {
println("キャッチできると思いきや、これは動きません")
}
}
delay(1000)
}
suspend fun throwException() {
delay(200)
throw RuntimeException("例外発生")
}
このコードは、例外がキャッチされずプログラムがクラッシュしてしまう可能性があります。launchを使うときはCoroutineExceptionHandlerを使う必要がありますが、それは別の記事で詳しく扱います。
7. 非同期処理とtry-catchを組み合わせるポイント
Kotlinで非同期処理を行うときにエラーを安全に扱うには、次のポイントを押さえておきましょう。
- エラーが発生する可能性がある箇所は、
try-catchで囲む async+await()のときにtry-catchを使うlaunchはCoroutineExceptionHandlerが必要(今回は扱いません)- メッセージ表示やログ出力で、原因を分かりやすく伝える
8. よくあるエラー例と対策
初心者がKotlinの非同期処理でつまずきやすいポイントも紹介しておきます。
- awaitを忘れる:
asyncで処理を書いたあとにawait()を呼ばないと結果が取得できません。 - catchブロックが空:何も処理を書かないと、何が起きたのか分かりません。エラーメッセージを表示しましょう。
- Exception以外をcatchしようとする:エラー型が違うとキャッチできないので、
Exception型でまとめて受け取るのが無難です。