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の書き方
Swiftの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については以下。
✔ Kotlinの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
}
なお、『単一式関数』に関しては、以下にまとめています。
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
以上です。
いつもご静聴ありがとうございます!
エンジニアの皆さん、お疲れ様です。