## 18.3 例外の使用方法

ライブラリの要素によって明示的に送出された例外はすべて、標準 C++ ライブラリ例外階層の構成要素となることが保証されています。どの関数がどの例外を送出するかについては、『標準 C++ クラスライブラリ・リファレンス』のこれらのクラスの項を参照してください。次に、特定の例外を捕獲するか、基底クラス例外の指定によって送出される例外を捕獲するかを選択することができます。

あるポイントへアクセスすると、そのポイントの位置が無効になる string を `insert` 関数で呼び出す場合、次のようなコードをしようします。

    string s;
    int n;
    ...
    try
    {
    s.insert(n,"Howdy");
    }
    catch (const exception& e)
    {
       // 例外を処理する
    }

ユーザー独自の例外を送出するには、適切な型の例外を作成し、それに適切なメッセージを割り当てて送出するだけです。以下に例を挙げます。

    ...
    if (n > max)
       throw out_of_range("You're past the end, bud");

クラス exception は、他のすべての例外クラスの基底クラスとなります。基底クラスとして、標準インタフェースを定義します。このインタフェースには `what()` メンバー関数が含まれており、例外と共に送出されるメッセージを表すヌルで終了している文字列を返します。この関数は、18.4 節のプログラム例に示すように、catch 句に最も有効な関数と思われます。

クラス exception は、メッセージ文字列を処理するコンストラクタを含んでいませんが、メッセージなしでも送出することができます。例外オブジェクトに `what()` を呼び出すと、デフォルトのメッセージが返されます。exception から派生するすべてのクラスは、特定のメッセージを指定できるコンストラクタを備えています。

基底例外を送出するには、次のコードを使用します。

    throw exception;

ただし、この例外を受け取る側は、どんなエラーが発生したかを認識していないため、この方法は一般的にあまり有効ではありません。基底例外の代わりに、logic_error のような派生クラスや、さらにそこから派生した、上記の例にある out_of_range のようなクラスを送出するのが一般的です。さらに、ユーザー独自のクラスを派生させて、階層を拡張することもできます。この方法により、特定の問題に固有のエラーを報告することができます。以下は例を示します。

    class bad_packet_error : public runtime_error
    {
       public:
          bad_packet_error(const string& what);
    };

    if (bad_packet())
       throw bad_packet_error("Packet size incorrect");

この節では、標準 C++ ライブラリの例外クラスが基本エラーモデルをどのように提供するかを説明しました。これを基礎として、ユーザー固有のアプリケーションに必要なエラー検出と報告するメソッドを構築することができます。

Copyright (c) 1998, Rogue Wave Software, Inc.
このマニュアルに関する誤りのご指摘やご質問は、電子メールにてお送りください。
OEM リリース, 1998 年 6 月