Swiftのthrowing関数とエラーハンドリングを徹底解説!初心者でもわかるエラー処理の基本
生徒
「Swiftでエラーが発生するかもしれない処理って、どうやって書くんですか?」
先生
「そういうときはthrowやtryを使って、throwing関数とエラーハンドリングで対応しますよ。」
生徒
「throwって投げるって意味ですよね?関数でどうやって使うんでしょうか?」
先生
「では、Swiftでのthrowing関数の使い方やエラーハンドリング方法を、例を使ってゆっくり説明していきましょう。」
1. throwing関数とは?
Swiftのthrowing関数とは、エラーが発生する可能性がある関数のことです。普通の関数とは違い、「もし何か問題が起きたら、エラーをthrow(投げる)して呼び出し元に伝えるよ」という意味を持ちます。
関数の定義時にthrowsキーワードを付けると、throwing関数になります。
func divide(_ a: Int, by b: Int) throws -> Int {
if b == 0 {
throw DivisionError.dividedByZero
}
return a / b
}
この関数は、割る数が0だったときにエラーをthrowしています。DivisionErrorはあとで定義します。
2. エラーの種類を定義しよう(Error型)
throwing関数で使うエラーは、Errorプロトコルに準拠した「列挙型(enum)」で定義します。
enum DivisionError: Error {
case dividedByZero
}
このDivisionErrorという列挙型には、dividedByZeroというケース(場合)を定義しています。これが「割り算で0除算エラーが発生した」ことを表すエラーになります。
3. tryでthrowing関数を呼び出す
throws付きの関数は、呼び出すときにtryを使う必要があります。これは「この関数を使うときはエラーが起きるかもしれないから注意してね」という意味です。
do {
let result = try divide(10, by: 0)
print("計算結果: \(result)")
} catch DivisionError.dividedByZero {
print("エラー: 0で割ることはできません")
}
この例では、divide関数をtryで呼び出し、エラーが発生した場合はcatchで処理しています。
4. do-catchでエラーを処理する方法
Swiftでは、do-catch文を使ってエラーハンドリング(=エラーをうまく処理すること)を行います。doブロックの中でエラーが出るかもしれない処理を書き、実際にエラーが出たらcatchで対応します。
do {
let result = try divide(10, by: 2)
print("計算結果: \(result)")
} catch {
print("何かしらのエラーが発生しました")
}
catchは、指定されたエラーに限らず、すべてのエラーを捕まえて処理できます。特定のエラーだけを処理したい場合は、catch DivisionError.dividedByZeroのように書きます。
5. try?とtry!の違いに注意しよう
tryには3種類の書き方があります:
- try:標準の書き方。
do-catchとセットで使う - try?:エラーが出ても
nilを返して無視する - try!:絶対にエラーが出ないと信じて使う(もし出たらアプリがクラッシュ)
例を見てみましょう。
let result1 = try? divide(10, by: 0)
print(result1) // nil(エラーが起きたため)
let result2 = try! divide(10, by: 2)
print(result2) // 5(エラーが出なかったので成功)
try?は安全ですが、エラーの詳細が分かりません。try!は便利ですが、使い方を間違えるとアプリが止まるので注意しましょう。
6. throwing関数と普通の関数の違い
普通の関数はエラーを返すことができません。何か問題が起きたとしても、戻り値の中でエラーを表現する必要があります。一方、throwing関数は、エラーが起きたらすぐにthrowして処理を中断し、呼び出し元に知らせることができます。
そのため、「失敗する可能性がある処理」はthrowing関数で書くと、コードの読みやすさや安全性が高くなります。
7. throwing関数はどんな場面で使う?
以下のような状況では、throwing関数がよく使われます:
- ファイルの読み書きで失敗する可能性があるとき
- ユーザーの入力値が不正なとき
- サーバーからのデータ取得で通信エラーが出る可能性があるとき
- データベースの操作で失敗することがあるとき
プログラムを作る上で、「うまくいかなかったとき」に備えて処理を書いておくことはとても大切です。Swiftではthrowing関数とエラーハンドリングを使って、こうした不具合にしっかり対応できます。