Module 05へようこそ
このモジュールでは、C++の**例外処理**を深く学びます。単に`try-catch`を使うだけでなく、エラー状況をクラスとして表現し、継承やポリモーフィズムを活用して、堅牢で柔軟なシステムを設計する手法を習得します。
テーマ:官僚制 (Bureaucracy)
このモジュールでは「官僚制」というユニークな世界観を通して学習を進めます。複雑で階層的なシステムをシミュレートするのに最適なテーマです。「階級が足りない」「書類が未署名」といった問題をプログラムの「例外」として捉え、エラーハンドリングを直感的に学びましょう。
課題シミュレーション
各エクササイズの機能をインタラクティブに試してみましょう。
EX00: Bureaucratの誕生
👤 Zaphod
Grade: 75
やってみよう:
官僚のGradeを増減させてみましょう。Gradeが1の時にインクリメント、または150の時にデクリメントしようとすると例外が発生します。
EX01: Formへの署名
👤 Ford
Grade: 50
この官僚で下のフォームに署名できます。
📋 Tax Form 27B/6
署名要件 Grade: 75
状態: 未署名
EX02: Formの実行
👤 Trillian
Grade: 20
Shrubbery Creation
署名: 145 / 実行: 137
状態: 未署名
Robotomy Request
署名: 72 / 実行: 45
状態: 未署名
Presidential Pardon
署名: 25 / 実行: 5
状態: 未署名
EX03: InternによるForm生成
🧑💻
Intern
生成したいフォーム名を入力してください:
"shrubbery creation", "robotomy request", "presidential pardon"が有効です。
ここにフォームが生成されます...
登場人物と概念
👤 Bureaucrat
システムの操作単位。名前と1~150の階級(Grade)を持つ。階級に応じてFormへの署名や実行が可能。
主な機能:
- `incrementGrade()` / `decrementGrade()`: 階級の増減。
- `signForm(Form&)`: フォームへの署名。
- `executeForm(AForm const&)`: フォームの実行。
📋 AForm (抽象クラス)
全てのフォームの基底クラス。「署名・実行に必要なGrade」など共通の属性と機能を持つ。`performAction()`という純粋仮想関数を持ち、具体的なアクションは派生クラスに実装を強制する。
ポイント:
ポリモーフィズムを実現する要。`AForm*`ポインタでどの種類のフォームも同じように扱える。
🧑💻 Intern
フォームを動的に生成する専門家。フォーム名(文字列)を受け取り、対応するフォームオブジェクトを生成して返す。
ポイント:
**ファクトリーパターン**を実装。オブジェクトの生成ロジックをカプセル化し、クライアントコードを具体的なクラス名から分離する。
技術詳細
なぜ`what()`に`throw()`が必要?
C++98では、`std::exception`を継承して独自の例外クラスを作る際、`what()`メソッドの宣言に`throw()`を付けることが必須でした。これは**「基底クラスの仮想関数をオーバーライドするときのルール」**に基づいています。
public:
virtual const char* what() const throw();
};
基底クラスである`std::exception`の`what()`メソッドが「例外を投げない(`throw()`)」と宣言しているため、それをオーバーライドする派生クラスも同じ約束を守らなければならない、というルールです。これにより、ポリモーフィズムを通じて例外を安全に扱うことが保証されます。
現代のC++では (`noexcept`)
`throw()`という動的例外仕様はC++11で非推奨となり、代わりにより強力な`noexcept`キーワードが導入されました。もしC++11以降の規格でコンパイルする場合、`noexcept`を使うのが正しい作法となります。
実践的な応用例
このモジュールで学んだ概念は、実際のソフトウェア開発で広く使われています。
データベースシステム
接続失敗、クエリ実行エラー、トランザクションの競合などを、それぞれ異なる例外クラスとして定義し、状況に応じた後処理(ロールバックなど)を行います。
GUIアプリケーション
ユーザーが存在しないファイルを開こうとしたり、不正な形式のデータを入力した場合に、カスタム例外を投げて適切なエラーダイアログを表示します。
Webサーバー
HTTPリクエストの解析中に不正なリクエスト(`400 Bad Request`)や、リソースが見つからない場合(`404 Not Found`)を例外として処理し、適切なHTTPステータスコードを返します。
プラグインシステム
ファクトリーパターンを使い、実行時に設定ファイルから読み込んだ情報に基づいて、様々なプラグイン(この課題の`AForm`に相当)を動的に生成・ロードします。