0Pricing
C++ Academy · レッスン

エラー処理パターン

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フィードバックを取得できます。ローカル設定は不要です。

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

  1. optionalによる値の不在の表現
  2. optional値へのアクセス
  3. std::expectedの基礎
  4. エラー処理パターン
← C++ Academyに戻る