エラー処理パターン
optionalとexpectedを組み合わせます
「エラー処理パターン」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
2つのツール、1つの目的
std::optionalとstd::expectedは、どちらもエラーを起こしやすい番兵値の代わりになります。このレッスンでは、両者を組み合わせてきれいに合成するパターンを紹介します。
空の場合の早期リターン
これはシンプルで読みやすいパターンです。optionalを確認し、空の場合は処理を続ける前に早期に処理を終了します。
#include <iostream>
#include <optional>
std::optional<int> parse(bool ok) { return ok ? std::optional<int>(5) : std::nullopt; }
int main() {
auto v = parse(true);
if (!v) { std::cout << "no value\n"; return 0; }
std::cout << *v + 1 << "\n";
}OptionalからExpectedへ
呼び出し側が理由を必要とする場合は、値がないoptionalを説明付きのエラーに変換します。
#include <expected>
#include <optional>
#include <string>
std::expected<int, std::string> require(std::optional<int> o) {
if (o) return *o;
return std::unexpected("value missing");
}
int main() {}value_orによる連結
複数の検索結果を1つの結果につなげる場合、value_orを使うと、ネストしたif文を書かずにその場でデフォルト値を指定できます。
#include <iostream>
#include <optional>
int setting(std::optional<int> user, int fallback) {
return user.value_or(fallback);
}
int main() {
std::cout << setting(std::nullopt, 42) << "\n";
}エラーの上位への伝播
std::expectedを使うと、関数はサブ呼び出しの結果を確認し、そのエラーを変更せずに呼び出し元へ転送できます。これによりエラーのパイプラインを構築できます。
#include <expected>
#include <string>
using R = std::expected<int, std::string>;
R step1(bool ok) { return ok ? R(2) : R(std::unexpected("step1 failed")); }
R run(bool ok) {
auto r = step1(ok);
if (!r) return std::unexpected(r.error());
return *r * 10;
}
int main() {}モナド型のand_then
C++23のand_thenは、それぞれがoptionalまたはexpectedを返す処理を連結します。最初の失敗で短絡するため、手作業でif文を連ねる必要がありません。
マッピングのためのtransform
transformは成功時の値に通常の関数を適用し、エラーや空の状態には変更を加えません。成功経路だけをマッピングできます。
リカバリのためのor_else
or_elseは、元の値が空または失敗している場合に、代替の値や別のエラーを提供できるフォールバックを実行します。
使い分け
不在に説明が必要ない場合(キャッシュミスなど)はoptionalを使用します。呼び出し側が失敗理由を区別する必要がある場合(解析エラーと権限エラーなど)はexpectedを使用します。
番兵値の混在を避ける
1つのAPIで、古い形式のエラーコードとoptionalまたはexpectedを混在させないでください。呼び出し側が失敗を一貫して処理できるよう、戦略を1つに統一してください。
エラーを型付けする
失敗をプログラムで確認する場合は、単なる文字列ではなく列挙型や小さな構造体をエラー型として使用することを優先してください。文字列は人間向けのメッセージに適しています。
理解度チェック
エラーハンドリングのパターンについての理解度を確認しましょう。
まとめ
エラーハンドリングのパターンについて学びました。
- 空またはエラーの場合に早期リターンすると、コードを平坦に保てます。
- 理由が必要な場合は、optionalをexpectedに変換します。
and_then、transform、or_else(C++23)を使って処理を合成します。- 一貫性を保ち、番兵値とoptionalまたはexpectedの混在を避けます。
よくある質問
「エラー処理パターン」レッスンは無料ですか?
はい。「エラー処理パターン」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「エラー処理パターン」で何を学びますか?
optionalとexpectedを組み合わせます ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「エラー処理パターン」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。