Day 17では、例外安全性とエラーハンドリングについて学習します。
C++では、プログラムが例外(予期しないエラー状態)に遭遇した際に、そのエラーを適切に処理することが重要です。例外安全性は、プログラムが例外が発生しても、リソースリークやデータ破損を防ぐための考慮と設計のことを指します。エラーハンドリングは、例外をキャッチし、適切に処理することを指します。
以下にそれぞれの内容を詳細に説明し、例題と演習問題を提示します。
例外安全性:
1. 強い例外安全保証:
– 関数が例外を送出した場合でも、関数が呼び出される前の状態に戻すことが保証される状態を指します。
2. 基本的例外安全保証:
– メモリリークはなく、データ破損もないことが保証される状態を指しますが、関数が呼び出される前の状態に戻すことは保証されません。
3. 弱い例外安全保証:
– メモリリークやデータ破損はないが、関数が例外を送出した場合、関数が呼び出される前の状態に戻ることは保証されません。
エラーハンドリング:
1. try-catchブロック:
– `try` ブロック内で例外が発生する可能性のあるコードを記述し、`catch` ブロックで例外をキャッチして適切な処理を行います。
2. 例外の種類:
– C++では、`std::exception` クラスを継承したカスタム例外クラスを定義することで、異なる例外の種類を作成できます。
例題:
#include <iostream> #include <stdexcept> // 例外を送出する関数 void divide(int a, int b) { if (b == 0) { throw std::runtime_error("Divide by zero."); } int result = a / b; std::cout << "Result: " << result << std::endl; } int main() { try { // 例外を送出する関数を呼び出し divide(10, 2); divide(5, 0); // ゼロで割り算を試みる } catch (const std::exception& e) { // 例外をキャッチしてエラーメッセージを表示 std::cerr << "Exception caught: " << e.what() << std::endl; } return 0; }
演習問題:
1. ユーザーに2つの整数を入力してもらい、それらの整数を割り算して表示するプログラムを作成してください。ただし、ゼロで割る場合には `std::runtime_error` 例外を送出し、それを適切にキャッチしてエラーメッセージを表示してください。
2. クラス `MyVector` を定義してください。このクラスは可変長の整数の配列を持ち、要素を追加するメソッド `add` と指定したインデックスの要素を取得するメソッド `get` を持ちます。ただし、インデックスが範囲外の場合には `std::out_of_range` 例外を送出してください。
これらの例題と演習問題を解くことで、例外安全性とエラーハンドリングの重要性を理解し、プログラムの信頼性と安全性を向上させることができます。問題を解いたら、例外が適切に処理されているかどうかを確認してみてください。