カテゴリ: Kotlin 更新日: 2025/09/15

Kotlinのrethrow(例外の再送出)の使い方を初心者向けに解説!catchで処理してから再度スローする方法

Kotlinの例外処理におけるrethrow(例外の再送出)の使い方
Kotlinの例外処理におけるrethrow(例外の再送出)の使い方

先生と生徒の会話形式で理解しよう

生徒

「Kotlinのcatchってエラーを捕まえて終わりですよね?」

先生

「たしかに普通はそうですが、一度処理してから再び投げることもできるんですよ。それをrethrow(リスロー)といいます。」

生徒

「えっ、投げるってどういう意味ですか?」

先生

「プログラムに『このエラーを上の処理に戻して!』と伝えることを“投げる”と言います。詳しく説明しますね!」

1. Kotlinのrethrow(再送出)とは?

1. Kotlinのrethrow(再送出)とは?
1. Kotlinのrethrow(再送出)とは?

Kotlin(コトリン)でtry-catchを使うと、エラー(例外)を捕まえて安全に処理できます。

ただし、catchの中で一度ログを残したり、ユーザーに通知を表示したりした後に、「このエラーはさらに上のレベルで扱ってほしい」という場面もあります。

そんなときに使うのがrethrow、つまり例外の再送出です。

2. 例外を再送出(rethrow)する基本構文

2. 例外を再送出(rethrow)する基本構文
2. 例外を再送出(rethrow)する基本構文

例外を再送出するには、catchの中でthrow eと書くだけです。ここでのecatchで受け取った例外オブジェクトです。

以下のコードで確認してみましょう。


fun riskyOperation() {
    try {
        val number = "abc".toInt()
    } catch (e: NumberFormatException) {
        println("ログ出力:変換に失敗しました")
        throw e // 例外を再送出
    }
}

このコードでは、まずtoInt()で失敗し、catchでログを出力。その後、throw eで再び例外を上の処理に投げ返しています。

3. 実行例:上位の関数で再送出された例外をキャッチする

3. 実行例:上位の関数で再送出された例外をキャッチする
3. 実行例:上位の関数で再送出された例外をキャッチする

例外を再送出すると、呼び出した元の関数にそのエラーが戻ってきます。実際にやってみましょう。


fun riskyOperation() {
    try {
        val number = "abc".toInt()
    } catch (e: NumberFormatException) {
        println("ログ:エラー発生 ${e.message}")
        throw e
    }
}

fun main() {
    try {
        riskyOperation()
    } catch (e: NumberFormatException) {
        println("main関数でエラーをキャッチしました")
    }
}

ログ:エラー発生 For input string: "abc"
main関数でエラーをキャッチしました

riskyOperation内でエラーをthrowして、それをmain関数が受け止めています。これが例外の再送出(rethrow)の基本的な流れです。

4. なぜrethrowが必要なのか?

4. なぜrethrowが必要なのか?
4. なぜrethrowが必要なのか?

例外を再送出する理由は、最終的な判断をもっと上の処理で行いたいからです。

たとえば、下の処理ではログだけ残して、画面にエラーメッセージを出すのは上の処理に任せたいときなどです。

また、大きなアプリでは、最上位でまとめて例外を処理する設計がよく使われています。

5. rethrowを使うときの注意点

5. rethrowを使うときの注意点
5. rethrowを使うときの注意点

必ずthrowするのは例外(Exception)でなければなりません。

catchで受け取ったe以外のものをthrowしようとすると、コンパイルエラーになります。

また、再送出した例外がどこでもキャッチされなければ、プログラムはエラーで終了します。そのため、上のレベルでもtry-catchを書いておくのが安心です。

6. rethrowの実用例:ファイル処理の中で使う

6. rethrowの実用例:ファイル処理の中で使う
6. rethrowの実用例:ファイル処理の中で使う

たとえば、ファイルを開くときにエラーが出る可能性がある場合、ログを残してから再送出する例です。


fun readFile() {
    try {
        throw java.io.IOException("ファイルが見つかりません")
    } catch (e: java.io.IOException) {
        println("エラーログ:${e.message}")
        throw e
    }
}

fun main() {
    try {
        readFile()
    } catch (e: java.io.IOException) {
        println("mainでファイルエラーを処理しました")
    }
}

エラーログ:ファイルが見つかりません
mainでファイルエラーを処理しました

このように、rethrowはエラーログを残しつつ、処理を上位に任せるためのテクニックとして使えます。

7. Kotlinの例外処理とrethrowを正しく使い分けよう

7. Kotlinの例外処理とrethrowを正しく使い分けよう
7. Kotlinの例外処理とrethrowを正しく使い分けよう

Kotlinでは、エラーをその場で処理するだけでなく、throwを使って再び投げることで、柔軟にエラーハンドリングができるようになります。

初心者でも使えるように、まずはログ出力 → throw → 上位でcatch、という流れを理解しておくと安心です。

カテゴリの一覧へ
新着記事
New1
Kotlin
Kotlinのforループの基本!範囲・配列・コレクションの繰り返し処理
New2
Go言語
Go言語のスライスでappend時のメモリの仕組みを理解しよう!初心者でもわかる基礎解説
New3
Go言語
Go言語のスコープとは?ローカル変数・グローバル変数の違いと使い分け
New4
Go言語
Go言語のhttp.ResponseWriterとhttp.Requestの仕組みを理解しよう
人気記事
No.1
Java&Spring記事人気No1
Go言語
Go言語の関数パラメータ!値渡しと参照渡しの違いを理解しよう
No.2
Java&Spring記事人気No2
Swift
Swift Playgroundの使い方を完全解説!初心者に最適な学習環境の始め方
No.3
Java&Spring記事人気No3
Kotlin
Gradleファイル(build.gradle.kts)の書き方と役割をやさしく解説!Kotlin初心者向け完全ガイド
No.4
Java&Spring記事人気No4
Swift
Swiftで数値と文字列を相互変換!NumberFormatterで桁区切りや通貨表示をわかりやすく解説
No.5
Java&Spring記事人気No5
Kotlin
Kotlinの演算子一覧と使い方!算術・比較・論理演算子の基本を解説
No.6
Java&Spring記事人気No6
Swift
Swift開発環境の構築方法を徹底解説!Xcode・Windows・Linux対応
No.7
Java&Spring記事人気No7
Kotlin
Kotlinで画面遷移を実装しよう!初心者でもわかるIntentの使い方完全ガイド
No.8
Java&Spring記事人気No8
Swift
SwiftPMでのバージョン指定と互換性の考え方を初心者向けに徹底解説