C++ 標準ライブラリ<exception>

C++ プログラミングにおいて、例外処理は重要なエラー処理メカニズムであり、プログラムがエラーに遭遇したときに、プログラムをクラッシュさせるのではなく、これらのエラーを適切に処理できるようにします。

C++ では、例外処理は通常、try、catch、throw キーワードを使用して実装されます。標準ライブラリには、例外を処理するための std::exception クラスとその派生クラスが用意されています。

C++ 標準ライブラリの<exception>ヘッダーファイルは、例外クラスや例外処理メカニズムなどを含む、例外処理のための基盤を提供します。

例外は、プログラムの実行中に発生するイベントであり、通常の命令フローを中断します。C++ では、例外は任意の型のオブジェクトにすることができますが、通常は例外クラスのオブジェクトです。C++ 標準ライブラリは、いくつかの基本的な例外クラスを定義しています。例えばstd::exception、std::bad_alloc、std::bad_castなど。

独自の例外クラスを定義して例外処理機能を拡張したり、標準ライブラリに既存の例外クラスを使用して一般的な例外状況を処理したりできます。

構文

例外をスローする

C++ では、throw キーワードを使用して例外をスローします。構文は次のとおりです。

throw exception_object;

例外をキャッチする

try と catch キーワードを使用して例外をキャッチして処理します。構文は次のとおりです。

try {
    // 可能抛出异常的代码
} catch (exception_type e) {
    // 处理异常的代码
}

キャッチする例外の型を指定することも、汎用の catch ブロックを使用してすべての型の例外をキャッチすることもできます:

try {
    // 可能会抛出异常的代码
} catch (const std::exception& e) {
    // 处理 std::exception 及其派生类的异常
} catch (...) {
    // 处理所有其他类型的异常
}

std::exception

std::exception は C++ 標準ライブラリで定義された基底クラスであり、すべての標準例外クラスの基礎となります。これは、what() などの仮想関数を定義しており、例外情報を返す C スタイルの文字列を返します。

class exception {
public:
    virtual const char* what() const noexcept;
};

標準例外クラス

C++ 標準ライブラリは、std::runtime_error、std::logic_error など、std::exception から派生した複数の例外クラスを提供しており、一般的な例外状況を表します。具体的な例外状況に応じて適切なクラスを選択して使用できます。

throw std::runtime_error("Runtime error occurred");
throw std::logic_error("Logic error occurred");

例

以下は、<exception>ヘッダーファイルを使用した簡単な例で、例外をスローしてキャッチする方法を示しています。

例

#include <iostream>
#include <exception>

class MyException : public std::exception {
public:
    const char* what() const throw() {
        return "My custom exception";
    }
};

int main() {
    try {
        // エラー状況をシミュレートする
        bool error_condition = true;
        if (error_condition) {
            throw MyException();
        }
    } catch (const std::exception& e) {
        std::cout << "Caught an exception: " << e.what() << std::endl;
    }

    return 0;
}

出力結果:

Caught an exception: My custom exception

例外クラス

C++ では、標準ライブラリはいくつかの一般的な例外クラスを提供しており、それらはすべてstd::exceptionから継承され、#include <stdexcept>をインクルードして使用できます。

以下は、一般的な C++ 例外クラスとその主な用途です:

  • std::exception: すべての標準例外クラスの基底クラスであり、例外の基本インターフェースを定義します。これには仮想関数what()があり、例外情報を返す C スタイルの文字列を返します。

  • std::runtime_error: 実行時エラーを表します。通常、プログラムのロジックの問題によって引き起こされる例外であり、無効なパラメータやファイルを開けないなどがあります。

    throw std::runtime_error("Runtime error occurred");
  • std::logic_error: 論理エラーを表します。通常、プログラムのロジックエラーによって引き起こされる例外であり、論理アサーションの失敗やインデックスの範囲外アクセスなどがあります。

     throw std::logic_error("Logic error occurred");
  • std::invalid_argument: 関数に渡されたパラメータが無効であることを表します。

    throw std::invalid_argument("Invalid argument");
  • std::out_of_range: 配列やコンテナなどの有効な範囲を超えてオブジェクトにアクセスすることを表します。

    throw std::out_of_range("Out of range");
    
  • std::overflow_errorとstd::underflow_error: 数値計算中にオーバーフローまたはアンダーフローが発生したことを表します。

    throw std::overflow_error("Overflow occurred");
    throw std::underflow_error("Underflow occurred");
    
  • std::bad_alloc: メモリ割り当ての失敗を表します。

    throw std::bad_alloc();  // 内存分配失败时抛出
    

例

#include <iostream>
#include <new> // std::bad_alloc 例外ヘッダーファイルをインクルード

int main() {
    try {
        // 大量のメモリを割り当てようとする
        int* largeArray = new int[1000000000000]; // メモリ割り当ての失敗をシミュレート
    } catch (const std::bad_alloc& e) {
        // std::bad_alloc 例外をキャッチし、エラーメッセージを出力
        std::cerr << "Memory allocation failed: " << e.what() << std::endl;
    }

    return 0;
}

出力:

Memory allocation failed: std::bad_alloc

注意事項

  • 例外は通常の制御フローに使用すべきではありません。例外状況を処理するためだけに使用すべきです。
  • 例外処理はプログラムのパフォーマンスに影響を与える可能性があるため、慎重に使用する必要があります。
  • 必ずcatchブロック内で可能なすべての例外の型を処理して、未処理の例外によってプログラムがクラッシュするのを防ぎます。

を使用することで、<exception>ヘッダーファイルを使用することで、C++ プログラマーはプログラム内のエラー状況をより効果的に処理し、プログラムの堅牢性と信頼性を向上させることができます。

その他の拡張