0Pricing
Swift Academy · レッスン

try awaitとエラーの伝播

throwing async関数で try await を使い、 do/catch で失敗を処理して、 CancellationError を含むエラーを適切に上位へ伝播させます。

「try awaitとエラーの伝播」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン3/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全3レッスンが含まれています。

なぜ try await なのでしょうか

try awaitはエラーをスローする非同期関数を呼び出します。エラーがスローされると、捕捉しない限り伝播します。try?を使ってOptionalに変換することもできます。

throwing async と do/catch

throwing async関数を作成し、do/catch内でtry awaitを使って呼び出すと、失敗を処理できます。

enum NetError: Error { case offline; case badStatus(Int) }

func fetchNumber(from ok: Bool) async throws -> Int {
    try await Task.sleep(nanoseconds: 100_000_000)
    if !ok { throw NetError.offline }
    return 7
}

Task {
    do {
        let n = try await fetchNumber(from: true)
        print("value:", n)          // 7
    } catch {
        print("failed:", error)     // handled here
    }
}

エラーの変換

try?を使うと、エラーをスローする代わりにOptionalを取得できます。失敗しないと確信できる場合を除き、try!は避けてください。

Task {
    // try? converts failure to nil
    let maybe = try? await fetchNumber(from: false)
    print("optional result:", String(describing: maybe)) // nil on error

    // ⚠️ try! will crash if an error is thrown — avoid in production
    // let forced = try! await fetchNumber(from: false)
}

エラーを上位へ伝播する

呼び出し元をasync throwsとして宣言すると、エラーを上位へ伝播できます。エラーはより上位の境界で処理できます。

func loadProfile(ok: Bool) async throws -> String {
    let id = try await fetchNumber(from: ok)   // propagate on error
    return "id:\\(id)"
}

Task {
    do {
        let s = try await loadProfile(ok: true)
        print(s) // "id:7"
    } catch {
        print("propagated:", error)
    }
}

特定のエラーを捕捉する

パターンマッチングを使ったcatchブロックを使用します。シャットダウン処理を速やかかつ静かに保つため、CancellationErrorを最初に処理します。

enum FileError: Error { case notFound }

func mightCancel() async throws {
    for _ in 0..<5 {
        try Task.checkCancellation()                 // throws CancellationError
        try await Task.sleep(nanoseconds: 30_000_000)
    }
}

Task {
    let t = Task { try await mightCancel() }
    t.cancel()
    do {
        try await t.value
    } catch is CancellationError {
        print("cancelled cleanly")                   // handle cancellation separately
    } catch {
        print("other error:", error)
    }
}

ガイドライン

ヒント:

  • 判断できる境界(UI、CLI、またはトップレベルのTask)までtryで伝播させます。
  • 明確さを保つため、ドメインエラー(enum)を優先します。
  • 値がないことを許容できる場合に限り、try?で変換します。
  • CancellationErrorは明確に区別して捕捉します。

try await によるエラー処理

確認問題: エラーが発生した場合、try await f()は何をしますか?

まとめ

まとめ: エラーをスローする非同期関数にはtry awaitを使い、ヘルパーからエラーを上位へ伝播させます。Optionalで問題ない場合はtry?で変換し、CancellationErrorは明示的に捕捉します。

よくある質問

「try awaitとエラーの伝播」レッスンは無料ですか?

はい。「try awaitとエラーの伝播」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全3レッスンが含まれています。

「try awaitとエラーの伝播」で何を学びますか?

throwing async関数で try await を使い、 do/catch で失敗を処理して、 CancellationError を含むエラーを適切に上位へ伝播させます。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/3です。

「try awaitとエラーの伝播」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 構造化並行性とasync関数
  2. async let、Task、キャンセル
  3. try awaitとエラーの伝播
← Swift Academyに戻る