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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 構造化並行性とasync関数
- async let、Task、キャンセル
- try awaitとエラーの伝播