#11 Swiftで学ぶエラーハンドリングの基本

Swiftのエラーハンドリングは、「エラーを投げる可能性がある」ことを関数の宣言に明示する、独自の仕組みを持っています。この記事では、Swiftにおけるエラーハンドリングの基本と、独自エラーの定義方法を解説します。

独自のエラーを定義する

Swiftでは、Errorプロトコルに準拠したenumでエラーの種類を定義するのが一般的です。

enum MyError: Error {
    case divideByZero
    case invalidInput
}

throwsという宣言

エラーを投げる可能性がある関数には、throwsというキーワードを付けます。

func divide(a: Int, b: Int) throws -> Int {
    if b == 0 {
        throw MyError.divideByZero
    }
    return a / b
}

do・try・catchで扱う

throwsが付いた関数を呼び出すには、do・try・catchという組み合わせを使います。

do {
    let result = try divide(a: 10, b: 0)
    print(result)
} catch MyError.divideByZero {
    print("0では割れません")
} catch {
    print("その他のエラーが発生しました")
}

関数呼び出しの前にtryを付ける必要がある点が、他の言語とは違うSwiftらしい特徴です。catchにエラーの種類を指定すれば、特定のエラーだけを個別に処理できます。

try?という便利な書き方

結果が失敗してもよい場合は、try?を使うと、失敗時にnilを返す形で簡潔に書けます。

let result = try? divide(a: 10, b: 0)

try!で強制的に成功を前提とする

「絶対に失敗しないはず」と確信している場合、try!を使うと強制的に結果を取り出せます。ただし、実際にエラーが発生した場合はその場でプログラムが停止するため、使用には注意が必要です。

Resultで成功・失敗を値として表す

非同期処理などでは、throwsの代わりにResult型を使って成功・失敗を表現することもあります。

func fetchData(completion: (Result) -> Void) {
    completion(.success("データ"))
}

fetchData { result in
    switch result {
    case .success(let data): print(data)
    case .failure(let error): print("失敗: \(error)")
    }
}

Swiftならではの注意点

throwsが付いていない関数は、そもそもエラーを投げられません。「エラーハンドリングが必要な関数かどうか」が、関数の宣言を見ただけで分かるのが、Swiftの安全性を支える設計です。

まとめ

Swiftのエラーハンドリングはthrows・do・try・catchが基本です。try?のような簡潔な書き方や、enumによる独自エラーの定義も状況に応じて活用しましょう。


本ページはプロモーションを含みます。

参考書籍(PR)

Swiftをもっと学びたい方には「これからつくる iPhoneアプリ開発入門」がおすすめです。


PR

コードを書かずに自動化したい方へ

「学んだけど自分の作業に組み込む時間がない」という方向けに、ダブルクリックで動く Windows専用の自動化ツールをオーダーメイドで作成しています。気になる方は こちらをご覧ください。

コメント

このブログの人気の投稿

#25 Rustで学ぶAI API(ChatGPT等)の呼び出し方の基本

#8 C++で学ぶ文字列操作の基本

#16 TypeScriptで学ぶ辞書型(マップ)の基本