【初心者向け】SwiftとKotlinのtry-catchの書き方

swift_kotlin_try_catch

SwiftとKotlinでの書き方を同時にまとめます。

今回はエラーハンドリングについて。

SwiftもKotlinも基本的に同じような構文を用います。

SwiftとKotlinのtry-catchの書き方

SwiftとKotlinのtry-catch文についてまとめていきます。

try-catchとは、tryとcatchの2つに分けてエラーを処理する構文のこと。

SwiftもKotlinも、try-catchは登場人物が多くて、初心者は理解に苦しむ所。覚えやすく言うと以下。

✔ Swiftのtry-catch

エラーを『throw』する関数に『throws』と書く。それを『do』の中で『try』しエラーは『catch』する。

✔ Kotlinのtry-catch

エラーを『throw』する関数を『try』の中で実行し、エラーは『catch』する。

それでも複雑そうですよね。

SwiftとKotlinでのtry-catchの書き方を以下より解説していきます。

✔ SwiftとKotlinのtry-catchの書き方

  1. Swiftのtry-catch
  2. Kotlinのtry-catch

Swiftのtry-catch

Swiftのtry-catchについては以下。

Swiftのtry-catchには登場人物が多いです…

事後処理を行う『defer』を合わせると、6種の処理について簡単に解説しておきます。

✔ Swiftのtry-catchで出てくる処理

詳細
throws関数定義に付与。関数処理内に『throw』がある関数に付与する。
throw『Error』型のエラーを投げる時に使う。
do『throws』が書かれた関数を呼び出す時に使うブロック(『{ }』のこと)。
try『throws』が書かれた関数を呼び出す時に関数名に付ける。
catch『throws』が書かれた関数を実行しエラーの時の処理を書くブロック。
defer『try-catch』の後の処理を書くブロック。

では、詳細は以下より。

Swiftのtry-catchについて例を用いながら解説します。

Swiftのtry-catchの書き方

Swiftのtry-catchは、厳密に言うと『do-try-catch』。

『throws』が宣言されている関数のエラーハンドリングを行う為の処理が、try-catchと呼ばれる処理です。


<!Errorに準拠したenumを定義>
enum ValueError: Error {
   case overLimitError
   case lowerLimitError
}

<!errorをthrowする関数の定義>
func validateValue(value: Int) throws -> Int {
   if value < 0 {
      throw ValueError.lowerLimitError
   } else if value > 100 {
      throw ValueError.overLimitError
   } else {
      return value + value
   }
}

<!throwsが宣言されている関数をエラーハンドリング>
do {
    var result = try validateValue(value: 50)
    print ("正常値: \(result)")
} catch ValueError.lowerLimitError {
    print ("error: 下限以下の値")
} catch ValueError.overLimitError {
    print ("error: 上限以上の値")
}

冒頭でSwiftのtry-catchについて説明した、以下の文と合わせてみて下さい。

『エラーを『throw』する関数に『throws』と書く。それを『do』の中で『try』しエラーは『catch』する。』

Swiftのtry-catchは、この一文を覚えればOK。

throwでエラー通知

Swiftのtry-catch内の『try』とついている関数。この関数には『throws』と書いてあります。

これはエラーを投げる可能性がある関数にはthrowsを意味しています。


func 関数名(引数名: 型) throws -> 戻り値の型 {
}

また、throwsがついた関数の中で、エラーを投げる部分には『throw』をつけます。


throw 定義したエラー(Errorプロトコルに準拠)

これらを踏まえ、Swiftのtry-catch内の『try』がついた関数の全貌。

実際に見てみた方が分かりやすいと思います。


<!Errorに準拠したenumを定義>
enum ValueError: Error {
   case overLimitError
   case lowerLimitError
}

<!errorをthrowする関数の定義>
func validateValue(value: Int) throws -> Int {
   if value < 0 {
      throw ValueError.lowerLimitError
   } else if value > 100 {
      throw ValueError.overLimitError
   } else {
      return value + value
   }
}

事後処理はdeferで

Swiftのtry-catchと合わせてもう1つ。覚えておくと便利なのが『defer』。

正常終了後、および、エラー終了後に必ず行いたい処理を書く場合に『defer』を使います。

事後処理が必要な場合などですね。

前述の例を用います。


<!throwsが宣言されている関数をエラーハンドリング>
do {
    defer {
        print ("do〜try〜catch終了")
    }
    var result = try validateValue(value: 50)
    print ("正常値: \(result)")
} catch ValueError.lowerLimitError {
    print ("error: 下限以下の値")
} catch ValueError.overLimitError {
    print ("error: 上限以上の値")
}

<!出力>
正常値: 50
do〜try〜catch終了

なお、『defer』はエラーで終了した場合も、エラーの後に呼ばれます。

Kotlinのtry-catch

Kotlrinのtry-catchについては以下。

Swiftのtry-catchより、Kotlinのtry-catchは登場人物が少し少ない。

事後処理を行う『finally』を合わせると、4種の処理について簡単に解説しておきます。

✔ Kotlinのtry-catchで出てくる処理

詳細
throw『Error』型のエラーを投げる時に使う。
try実行するとエラーが発生する可能性がある処理を書くブロック(『{ }』のこと)。
catch実行しエラーが発生した際の処理を書くブロック。
finally『try-catch』の後の処理を書くブロック。

では、詳細は以下より。

Swiftのtry-catch同様に、Kotlinのtry-catchについても例を用いながら解説します。

Kotlinのtry-catchの書き方

Kotlinのtry-catchは、エラーが発生する可能性がある処理をエラーハンドリングする為の処理です。

Swiftのtry-catch同様、Kotlinでもtry-catch式でerrorを処理します。


<!try-catch文>

fun validationValue(value : String): Int {
     try {
         Integer.parseInt(value)
     } catch (e: NumberFormatException) {
         return 1
     }
}

Swiftのtry-catchと異なる点は、Kotlinのtry-catch処理が『式』である点。

下記のように単一式関数として書く事もできます。


<!try-catch文>

fun validationValue(value : String) =
     try {
         Integer.parseInt(value)
     } catch (e: NumberFormatException) {
         return 1
     }

なお、『単一式関数』に関しては、以下にまとめています。

swift_kotlin_function

throw式でエラー通知

Kotlinではエラーを投げる時は、エラー型の処理の前に『throw』と書くだけでOK。

Swiftと異なり、エラーを投げる可能性のある関数に『throws』に相当する宣言が不要である事です。


<!errorをthrowする関数の定義>
fun validateValue(value: Int): Int =
   if (value < 0) {
      throw IllegalArgumentException("lowerLimitError")
   } else if value > 100 {
      throw IllegalArgumentException("overLimitError")
   } else {
      return value + value
   }
}

事後処理はfinallyで

Swiftのtry-catchの事後処理で『defer』を使うように、Kotlinのtry-catchで事後処理を行う場合は『finally』ブロックを使います。

エラーで終了した後に必ず行いたい処理を書くことができます。


fun validationValue(value : String) =
     try {
         Integer.parseInt(value)
     } catch (e: NumberFormatException) {
         return 1
     } finally {
         print("end")
     }

<!呼び出し>
inputValue("abcde")

<!出力>
1
end

以上です。

いつもご静聴ありがとうございます!

エンジニアの皆さん、お疲れ様です。