C++ 例外クラス: 独自の例外クラスの作成

例外クラス:

1. <stdexcel> ヘッダー ファイル

std::logic_error: プログラム ロジック エラーの基本クラス。

  1.  std::domain_error: 数学関数の入力パラメーターが関数のドメインを超えるとスローされます。
  2.  std::invalid_argument: 無効な引数が渡された場合にスローされます。
  3.  std::length_error: 最大許容サイズを超えるオブジェクトを作成しようとするとスローされます。
  4.  std::out_of_range: コンテナ内に存在しない要素にアクセスしようとするとスローされます。

std::runtime_error: ランタイム エラーの基本クラス。

  1.  std::overflow_error: 数学演算がオーバーフローした場合にスローされます。
  2.  std::underflow_error: 算術演算がアンダーフローしたときにスローされます。
  3.  std::range_error: 計算結果の範囲を表現できない場合にスローされます。

2. <新しい> ヘッダー ファイル

  1. std::bad_alloc: 動的メモリ割り当てが失敗した場合にスローされます。
  2. std::bad_array_new_length: 配列を割り当てようとしたときに長さが無効であるか長すぎる場合にスローされます。

3. <typeinfo> ヘッダー ファイル

  1. std::bad_cast: `dynamic_cast` が失敗した場合にスローされます。
  2. std::bad_typeid: `nullptr` で `typeid` を使用するとスローされます。

4. <機能> ヘッダー ファイル

  • std::bad_function_call**: 空の `std::function` オブジェクトを呼び出すときにスローされます。

5. <memory> ヘッダー ファイル

  • std::bad_weak_ptr: `std::shared_ptr` を構築するときに、渡された `std::weak_ptr` が無効な場合にスローします。

6. <future> ヘッダー ファイル

  • std::future_error: `std::future` または `std::promise` オブジェクトを処理するときに発生するエラー。

7. <regex> ヘッダー ファイル

  • std::regex_error: 正規表現オブジェクトの処理中にエラーが発生しました。

8. <system_error> ヘッダー ファイル

  • std::system_error: システムレベルのエラー状態を報告するために使用されます。

9. <variant> ヘッダー ファイル

  •  std::bad_variant_access: 間違った型の `std::variant` オブジェクトにアクセスするとスローされます。

10. <オプション> ヘッダー ファイル

  • std::bad_optional_access: 空の `std::optional` オブジェクトにアクセスするとスローされます。

11. <例外> ヘッダー ファイル

  1. std::bad_Exception: 例外ハンドラーが予測できない例外に遭遇したときにスローされます。
  2. std::Exception: すべての標準例外の基本クラス。

12. 同時実行性、同期、スレッド関連の例外

        `<thread>`、`<mutex>`、`<condition_variable>`、`<shared_mutex>` およびその他のヘッダー ファイルに出現する可能性があります。これらの例外は主に、スレッドの作成、同期メカニズム、条件変数などに関連します。

  • std::system_error**: 通常、スレッド作成の失敗など、スレッド関連のエラーを報告するために使用されます。

        各例外クラスは、例外を説明する文字列を返す「what()」メンバー関数を提供します。コードを記述する場合、例外をスローする可能性のあるコードを「try」ブロックに配置し、その例外を「catch」ブロックで処理するのが一般的です。

独自の例外クラスを作成します。

        独自の例外クラスを作成するには、通常、`std::Exception` クラスまたはその派生クラスから継承し、`what()` 関数をオーバーライドします。以下は、カスタム例外クラスを作成する簡単な例です。

例 1: `std::Exception` からの直接継承

#include <iostream>
#include <exception>
#include <string>

class MyException : public std::exception {
private:
    std::string message;
public:
    MyException(const std::string& msg) : message(msg) {}

    // Override the what() function
    const char* what() const noexcept override {
        return message.c_str();
    }
};

int main() {
    try {
        throw MyException("This is my custom exception!");
    } catch(const std::exception& e) {
        std::cerr << e.what() << '\n';
    }
    return 0;
}

例 2: 具象例外クラスからの派生

#include <iostream>
#include <stdexcept>
#include <string>

class MyOutOfRange : public std::out_of_range {
public:
    MyOutOfRange(const std::string& msg) : std::out_of_range(msg) {}
};

int main() {
    try {
        throw MyOutOfRange("Index is out of range!");
    } catch(const std::exception& e) {
        std::cerr << e.what() << '\n';
    }
    return 0;
}

        上記の例では、最初の例はカスタム例外クラスを `std::Exception` から直接派生する方法を示し、2 番目の例はより具体的な例外クラスである `std::out_of_range` からカスタム例外クラスを派生する方法を示しています。派生。

        実際の使用では、必要に応じて、最適な基本クラスを選択して独自の例外クラスを派生できます。

おすすめ

転載: blog.csdn.net/crr411422/article/details/131165776