Menu
Coddy logo textTech

throws と Error

CoddyのSwiftジャーニー「ロジックとフロー」セクションの一部 — レッスン 44/56。

Swiftは、関数が失敗する可能性があることを宣言させることでエラーを処理します。関数の本体はエラー値をスローし、呼び出し側はそれを処理しなければなりません。

エラー型とは、組み込みの Error プロトコルに準拠するあらゆるもののことです。独自のエラーを宣言する最も簡単な方法は、列挙型(enum)を使用することです:

enum InputError: Error {
    case empty
    case tooLong
}

エラーをスローする関数は、そのシグネチャで throws キーワードを使用し、その本体で throw 文を使用します:

func validate(_ s: String) throws -> String {
    if s.isEmpty { throw InputError.empty }
    if s.count > 100 { throw InputError.tooLong }
    return s
}

エラーをスローする関数を直接呼び出すことはできません。コンパイラによってエラーの処理が強制されます。次のレッスンでその方法を説明します。

challenge icon

チャレンジ

簡単

2つのケース negativetooBig を持つ、enum NumError: Error を定義してください。

以下の動作をするスロー関数(throwing function) doubleSafely(_ n: Int) throws -> Int を定義してください:

  • n < 0 のときは .negative をスローする
  • n > 100 のときは .tooBig をスローする
  • それ以外の場合は n * 2 を返す

標準入力から1つの整数を読み込みます。do/catch ブロックの中で doubleSafely を呼び出してください(正確な形式は次のレッスンで学びますが、今は以下のスケルトンをそのまま使用してください):

do {
    let result = try doubleSafely(n)
    print("ok: \(result)")
} catch NumError.negative {
    print("negative")
} catch NumError.tooBig {
    print("too big")
} catch {
    print("unknown")
}

入力が 10 の場合、出力は ok: 20 となります。-1 の場合は negative500 の場合は too big となります。

チートシート

Errorに準拠した列挙型(enum)を使用してエラー型を定義します:

enum InputError: Error {
    case empty
    case tooLong
}

throwsを使用して関数がエラーをスローすることをマークし、throwを使用してエラーを発生させます:

func validate(_ s: String) throws -> String {
    if s.isEmpty { throw InputError.empty }
    if s.count > 100 { throw InputError.tooLong }
    return s
}

エラーをスローする関数は、エラーハンドリング(例:do/catch)を伴って呼び出す必要があります。これはコンパイラによって強制されます。

自分で試してみよう

let n = Int(readLine()!)!

// TODO: enum NumError: Error { case negative, tooBig }
// func doubleSafely(_ n: Int) throws -> Int { ... }
// do { let r = try doubleSafely(n); ... } catch NumError.negative { ... } ...
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン