エラー処理演算子
catch、retry、replaceErrorでエラーから復旧します。
「エラー処理演算子」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。
Combineのエラー
CombineのパブリッシャーにはFailure型があります。パブリッシャーが失敗するとストリームは終了し、それ以降値は発行されません。堅牢なパイプラインを構築するには、エラーを処理、変換、または回復する演算子が必要です。
Failure型
すべてのパブリッシャーはOutputとFailureを宣言します。エラー型が一致している場合にのみパイプラインをコンパイルできるため、Failureを変更する演算子がよく使われます。
let publisher: AnyPublisher<Data, URLError> = apiClient.request()
// Output = Data, Failure = URLErrorcatch
catchは失敗を受け取り、失敗したパブリッシャーを新しいパブリッシャーに置き換えます。これにより、問題が発生したときにフォールバック値を提供できます。
apiClient.fetchUser()
.catch { error in
Just(User.guest)
}
.sink { user in
print("Got", user.name)
}
.store(in: &cancellables)replaceError
replaceError(with:)はcatchを簡略化したもので、あらゆる失敗を1つのフォールバック値に置き換え、正常に完了させます。
apiClient.fetchCount()
.replaceError(with: 0)
.sink { count in
self.badge.text = "\(count)"
}
.store(in: &cancellables)retry
retry(n)は、上流の処理が失敗したときに、最大でn回まで再購読します。一時的なネットワークエラーに適しています。
apiClient.fetchData()
.retry(3)
.sink(receiveCompletion: { print($0) },
receiveValue: { print($0) })
.store(in: &cancellables)retry と catch の組み合わせ
よく使われる堅牢なパターンです。数回 retry し、すべての試行が失敗した場合は catch でフォールバックします。
apiClient.fetchData()
.retry(2)
.catch { _ in
Just(Data())
}
.sink { data in
self.process(data)
}
.store(in: &cancellables)mapError
mapError は、あるエラー型を別のエラー型に変換します。異なる上流の失敗を、アプリケーションレベルの単一のエラー型に統一するために不可欠です。
enum AppError: Error { case network }
apiClient.request()
.mapError { _ in AppError.network }
.sink(receiveCompletion: { _ in }, receiveValue: { _ in })
.store(in: &cancellables)mapError が重要な理由
Publisher を組み合わせるときは、それらの Failure 型が一致していなければなりません。mapError は一致しないエラーを正規化するため、merge や zip などのオペレーターをコンパイルでき、sink でも1種類のエラー型を処理できます。
setFailureType
Just のように、失敗型が Never の Publisher もあります。setFailureType(to:) を使うと、失敗する Publisher と組み合わせられるようになります。
Just(42)
.setFailureType(to: AppError.self)
.merge(with: failablePublisher)
.sink(receiveCompletion: { _ in }, receiveValue: { _ in })
.store(in: &cancellables)完了の処理
sink の完了クロージャは、ストリームが完了したのか失敗したのかを知らせます。上流で回復されなかったエラーに対応するため、完了の内容を確認してください。
publisher.sink(
receiveCompletion: { completion in
if case .failure(let error) = completion {
self.showAlert(error)
}
},
receiveValue: { value in
self.update(value)
}
).store(in: &cancellables)堅牢なパイプラインの設計
エラー処理のベストプラクティス:
- 一時的な失敗には retry を使用します
- フォールバックには catch または replaceError を使用します
- エラー型の統一には mapError を使用します
sinkでは必ず失敗のケースを処理します
確認問題
エラー処理に関する知識を確認しましょう。
まとめ
Combine のエラー処理オペレーターについて学びました:
- catch / replaceError — フォールバックを提供します
- retry — 失敗時に再試行します
- mapError / setFailureType — エラー型を統一します
これらを組み合わせることで、最初のエラーで停止するのではなく、適切に機能を縮退させるパイプラインを構築できます。
よくある質問
「エラー処理演算子」レッスンは無料ですか?
はい。「エラー処理演算子」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。
「エラー処理演算子」で何を学びますか?
catch、retry、replaceErrorでエラーから復旧します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Swift Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「エラー処理演算子」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSwift Academyレッスンでコードを書いて実行できますか?
はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。