Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Swift辞典

  1. トップページ
  2. Swift辞典
  3. throws / try / do-catch

throws / try / do-catch

Swiftのエラー処理は『throws』でエラーを宣言し、『try』で呼び出し、『do-catch』で捕捉するパターンで構成されます。

構文
// throws 関数の定義
func 関数名() throws -> 型 {
    // エラーを投げる
    throw エラー
}

// 通常の呼び出し(do-catch)
do {
    let result = try 関数名()
} catch エラー型.ケース {
    // 特定のエラーを処理
} catch {
    // その他のエラー(error 変数が使える)
}

// Optional に変換(失敗時は nil)
let result = try? 関数名()

// 強制実行(失敗時はクラッシュ)
let result2 = try! 関数名()
構文一覧
構文概要
throws関数がエラーを投げることを宣言します。
throw エラーエラーを投げます。関数の実行を即座に終了します。
try 式throws 関数を呼び出します。do-catch 内で使います。
try? 式エラーが発生した場合 nil を返します(Optional に変換)。
try! 式エラーが発生しないと確信している場合に使います。失敗時はクラッシュします。
rethrows引数として受け取ったクロージャがエラーを投げる場合にのみエラーを伝播します。
サンプルコード
enum ParseError: Error {
    case invalidFormat
    case outOfRange(value: Int)
}

// throws 関数の定義
func parseAge(_ input: String) throws -> Int {
    guard let age = Int(input) else {
        throw ParseError.invalidFormat
    }
    guard (0...150).contains(age) else {
        throw ParseError.outOfRange(value: age)
    }
    return age
}

// do-catch でエラー処理
func processInput(_ input: String) {
    do {
        let age = try parseAge(input)
        print("年齢: \(age)歳")
    } catch ParseError.invalidFormat {
        print("エラー: 数値を入力してください")
    } catch ParseError.outOfRange(let value) {
        print("エラー: \(value) は範囲外です(0〜150)")
    } catch {
        print("予期しないエラー: \(error)")
    }
}

processInput("25")
processInput("abc")
processInput("200")

// try?: Optional に変換
let age1 = try? parseAge("30")    // Optional(30)
let age2 = try? parseAge("invalid") // nil
print("age1: \(age1 as Any)")
print("age2: \(age2 as Any)")

// rethrows: クロージャのエラーを伝播
func apply(_ value: Int, _ transform: (Int) throws -> Int) rethrows -> Int {
    return try transform(value)
}

let result = try? apply(10) { v in
    if v < 0 { throw ParseError.outOfRange(value: v) }
    return v * 2
}
print("result: \(result as Any)")
概要

Swift のエラー処理は型安全です。『throws』が付いた関数は必ず『try』を付けて呼び出す必要があり、コンパイラがエラー処理の漏れを検出します。

catch パターンは上から順に評価されます。より具体的なエラーを先に書き、汎用的な catch は最後に書きます。『try!』はエラーが絶対に起きないと確信できる場合のみ使用してください。エラーが発生するとアプリがクラッシュします。

Result 型を使ったエラー処理についてはResult<Success, Failure>を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。