Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
Error / enum でエラー定義
Swiftでは『Error』プロトコルに準拠した enum を使ってカスタムエラーを定義します。エラーに関連値を持たせることで、詳細なエラー情報を伝達できます。
構文
// カスタムエラーの定義
enum エラー名: Error {
case ケース1
case ケース2(詳細: String)
}
// LocalizedError: ユーザー向けのメッセージを提供
enum エラー名: LocalizedError {
case ケース1
var errorDescription: String? {
switch self {
case .ケース1: return "エラーの説明"
}
}
}
プロトコル一覧
| プロトコル | 概要 |
|---|---|
| Error | エラー型の基本プロトコルです。enum が準拠するのが一般的です。 |
| LocalizedError | Error を継承し、ローカライズされたエラーメッセージを提供します。 |
| errorDescription | LocalizedError のプロパティ。エラーの説明文を返します。 |
| failureReason | LocalizedError のプロパティ。失敗した理由を返します。 |
| recoverySuggestion | LocalizedError のプロパティ。回復方法の提案を返します。 |
サンプルコード
// カスタムエラーの定義
enum NetworkError: Error {
case notFound
case unauthorized
case serverError(statusCode: Int)
case timeout(after: Double)
}
// LocalizedError でユーザー向けメッセージを追加
extension NetworkError: LocalizedError {
var errorDescription: String? {
switch self {
case .notFound:
return "ページが見つかりません(404)"
case .unauthorized:
return "認証が必要です(401)"
case .serverError(let code):
return "サーバーエラーが発生しました(\(code))"
case .timeout(let seconds):
return "\(seconds)秒後にタイムアウトしました"
}
}
}
// エラーの使用
func fetchData(url: String) throws -> String {
guard url.starts(with: "https") else {
throw NetworkError.unauthorized
}
guard url != "https://example.com/missing" else {
throw NetworkError.notFound
}
return "データを取得しました"
}
// do-catch でエラーを処理
do {
let data = try fetchData(url: "https://example.com/missing")
print(data)
} catch let error as NetworkError {
print("ネットワークエラー: \(error.localizedDescription)")
} catch {
print("その他のエラー: \(error)")
}
// try? で Optional に変換
let result = try? fetchData(url: "https://example.com/api")
print("結果: \(result ?? "失敗")")
概要
Swift のエラー処理は『throws』『try』『do-catch』を組み合わせて使います。エラーは『Error』プロトコルに準拠した任意の型で定義できますが、enum が最も一般的です。
『LocalizedError』に準拠することで『error.localizedDescription』からユーザー向けのメッセージを取得できます。Swift のエラー処理は例外ではなく「エラーの伝播」です。エラーが throw されると即座に関数が終了し、呼び出し元で処理する必要があります。
throws / try / do-catch についてはthrows / try / do-catchを参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。