Swift Errorプロトコルの作り方|独自エラー型の設計
生徒
「先生、Swiftのエラーって自分で作れるんですか?ライブラリにあるものしか使えないと思ってました。」
先生
「いいところに気づきましたね。SwiftではErrorプロトコルを使って、独自のエラー型を簡単に作ることができますよ。」
生徒
「独自エラー型って、どういうときに使うんですか?」
先生
「例えばファイル操作やネットワーク通信など、状況ごとに違うエラーを表したいときにとても便利なんです。」
1. SwiftのErrorプロトコルとは?
Swiftでは、エラーを表す型はすべてErrorプロトコルに準拠する必要があります。プロトコルとは「ルールの集合」のようなもので、これに準拠すればエラーとして扱えるようになります。
標準ライブラリの多くのエラーもErrorプロトコルに準拠して作られています。私たちも同じ仕組みを使って、独自のエラーを定義できます。
2. 独自エラー型を作る基本
最も一般的なのは、enum(列挙型)を使ってエラーを定義する方法です。複数のケースを分けられるので、エラーの種類を表現するのに向いています。
enum FileError: Error {
case notFound
case noPermission
case unknown
}
このように書くと、FileErrorはエラー型として扱えるようになります。notFoundは「ファイルが見つからない」、noPermissionは「権限がない」、unknownは「その他不明なエラー」という意味を持たせられます。
3. throwで独自エラーを投げる
定義した独自エラーは、関数の中でthrowを使って投げられます。例えば次のようにファイルを開く関数を作れます。
func openFile(name: String) throws {
if name == "" {
throw FileError.notFound
}
if name == "secret.txt" {
throw FileError.noPermission
}
print("ファイルを開きました")
}
条件に応じて、FileErrorのケースを投げることができます。
4. do-catchで独自エラーを処理する
投げられた独自エラーは、呼び出し側でdo-catchを使って捕まえます。
do {
try openFile(name: "secret.txt")
} catch FileError.notFound {
print("ファイルが見つかりません")
} catch FileError.noPermission {
print("権限がありません")
} catch {
print("その他のエラー: \(error)")
}
権限がありません
特定のケースごとに分岐できるので、ユーザーに適切なメッセージを表示できます。
5. 構造体やクラスでも独自エラー型を作れる
enumだけでなく、struct(構造体)やclass(クラス)を使って独自エラーを作ることも可能です。より詳細な情報を持たせたいときに便利です。
struct NetworkError: Error {
let code: Int
let message: String
}
例えば「エラーコード」や「説明文」を持たせれば、開発者やユーザーにとって分かりやすいエラー表示が可能になります。
6. 独自エラー型を使うメリット
独自エラー型を設計するメリットは以下の通りです。
- エラーの種類を明確に分けられる。
- ユーザーに分かりやすいメッセージを表示できる。
- 開発者が原因を特定しやすくなる。
- アプリの信頼性を高められる。
特にアプリ開発では「何が原因でエラーになったのか」を明確にすることが、トラブル解決やユーザー体験の向上につながります。
7. 現実的な利用シーン
独自エラー型は、例えば以下のような場面でよく使われます。
- ネットワーク通信(接続失敗、タイムアウト、無効なレスポンスなど)
- データベース操作(データが見つからない、保存失敗など)
- ファイル操作(読み込み権限なし、書き込み失敗など)
これらの場面でErrorプロトコルを活用すれば、アプリがエラーに強くなり、ユーザーにも親切な挙動を実現できます。