エラーハンドリングについて
エラーハンドリングとは?
アプリ内で想定外の事象(例:通信エラーやファイルの欠如など)が発生した際に、それを検知して安全に対処する仕組みを「エラーハンドリング」といいます。
アプリはいつも想定内の動きをする訳ではなく、ネットワークの通信エラーやファイルが見つからないといった「想定外の事象」が起こることはよくあります。
エラー処理を適切に記述してないと、想定外の事象が発生した際にプログラムは異常終了してしまいます。
その結果、ユーザー体験が壊れ信頼性の低いアプリと判断され、ユーザーの離脱に繋がる可能性もあります。
今回はいくつかあるエラー処理の中でiOS標準のdo-cacth
構文について纏めます。
参考文献
do-catch構文について
do-catch構文は、エラーが発生する可能性のある処理を安全に扱うための仕組みです。
do節の中にエラーが発生する可能性のある処理を記述し、その処理を呼び出す際にはtry
キーワードを先頭に付けて呼び出します。
do節内で想定外のエラーが発生すると、処理の流れは自動的にcatch節へ移り、catch節内に記述されたエラー時の処理(エラーメッセージの表示やリトライ処理など)が実行されます。
catch節は複数書くこともでき、発生したエラーの種類ごとに処理を分けることが可能です。
基本構文
func loadFile(named fileName: String) throws -> String {
if fileName.isEmpty {
throw FileError.notFound
}
return "ファイル \(fileName) の内容を読み込みました。"
}
do {
let content = try loadFile(named: "config.txt")
print(content)
} catch {
print("エラーが発生しました: \(error)")
}
エラーを返す仕組みについて
エラーを検知する動きの基本は 「エラーをthrowで投げて、catchで受け取る」 という流れです。
Swiftでエラーを扱うには、独自にエラー型を定義する方法と、既存のNSErrorクラスを使う方法の2つがあります。
Errorプロトコル
Swift標準のエラー処理方法で、通常は列挙型(enum)で定義します。
メリットは発生し得るエラーを型で網羅的に扱えるのが特徴です。
enum FileError: Error {
case notFound
case noPermission
}
do {
throw FileError.notFound
} catch FileError.notFound {
print("ファイルが見つかりません")
} catch {
print("その他のエラー")
}
NSError
Apple標準フレームワークのFoundationに含まれているNSErrorがあります。NSError
はObjective-C
で標準的に使われていたエラークラスです。
domain
、code
、userInfo
の3つのプロパティを持ち、エラーの詳細を柔軟に表現できます。
SwiftコードではErrorプロトコルを使うのが一般的ですが、NSErrorはObjective-CベースのAPI(UIKitやFoundationの一部など)との互換性を保つ場合に利用されます。
let error = NSError(
domain: "com.example.app",
code: 404,
userInfo: [NSLocalizedDescriptionKey: "ファイルが見つかりません"]
)
do {
throw error
} catch {
print(error.localizedDescription) // => ファイルが見つかりません
}
どちらの方法でも最終的な動作は同じで、 「エラーをthrowで投げて、catchで受け取る」 という流れです。
throwsキーワードについて
throwsは 「この関数・メソッドの中でエラーをthrowする可能性がありますよ」 という宣言です。
これを付けた関数を呼び出す側は、tryを使って呼び出す必要があります。
throwキーワードについて
throw文は「エラーを発生させる文」であり、Swiftでは「エラーを投げる(throwする)」と言い実際にエラーを発生させる命令です。
これは、関数やメソッドの中で異常状態を検出したときに、その処理を中断し、エラーを呼び出し元に渡すための仕組みです。
エラー処理で使用されるそれぞれのプログラム構文の意味
キーワード | Swiftでの意味 |
---|---|
do | エラーを投げる可能性がある処理を囲むブロック。 |
catch | doブロックで発生したエラーを受け取って処理するブロック。 |
throws | 関数やメソッドが「エラーを投げる可能性がある」と宣言するキーワード。呼び出し側でtryが必要になる。 |
throw | 実際にエラーを発生(スロー)させる命令。throw SomeError.xxx の形で使う。 |
try | throws付き関数を呼ぶときに使う。エラーが発生する可能性があるため、do-catchやtry?、try!などと組み合わせる。 |
まとめ
エラーハンドリングは、アプリの信頼性を支える重要な仕組みです。
適切に扱うことで、クラッシュを防ぎ、ユーザーに安心して使ってもらえるアプリを作ることができます。