catch ブロックがどのように評価されるか (C++)
C++ では一般に std から派生した型をスローすることをお勧めしますが型の例外をスローすることができます :: 例外。C.C++ 例外がスローされた例外と同じ型を指定するまたは例外の種類をキャッチするハンドラーによってできます Catch ハンドラーによってキャッチできます。
スローされた例外の種類が基本クラス (クラス) を持つクラスである場合すべての種類の例外の基本クラスを使用するとすべての種類の例外の基本クラスを参照できますハンドラーによってキャッチできます。例外が参照でキャッチと実際のスローされた例外オブジェクトにバインドされることに注意してください ; それ以外の場合はコピー (関数の引数と同様に) です。
例外がスローされるとハンドラーに次の Catch 型によって発生したかも知れません :
型を受け取るハンドラー (省略記号構文を使用)。
例外オブジェクトと同じ型を受け取るハンドラー ; これはコピーであるため 定数 と volatile の修飾子は無視されます。
例外オブジェクトと同じ型への参照を受け入れるハンドラー。
の 定数 または volatile のフォームへの参照を受け入れるハンドラーは例外オブジェクトとして同じ入力します。
例外オブジェクトと同じ型の基本クラスを使用するハンドラー ; これはコピーであるため 定数 と volatile の修飾子は無視されます。基本クラスの Catch ハンドラーは派生クラスの Catch ハンドラーを指定する必要があります。
例外オブジェクトと同じ型の基本クラスへの参照を受け入れるハンドラー。
の基本クラスの 定数 または volatile のフォームへの参照を受け入れるハンドラーは例外オブジェクトとして同じ入力します。
スローされたポインター オブジェクトが標準的なポインター変換規則に変換できるポインターを受け取るハンドラー。
Catch ハンドラーが表示される順序はに表示される順序で特定の Try のハンドラー ブロックがありますがチェックされます。たとえば派生クラスのハンドラーの前に基本クラスのハンドラーを配置するとエラーが発生します。Catch 一致するハンドラーが完成したら後続のハンドラーはチェックされません。その結果省略記号 Catch ハンドラーは Try ブロックの最後のハンドラーにする必要があります。次に例を示します。
// ...
try
{
// ...
}
catch( ... )
{
// Handle exception here.
}
// Error: the next two handlers are never examined.
catch( const char * str )
{
cout << "Caught exception: " << str << endl;
}
catch( CExcptClass E )
{
// Handle CExcptClass exception here.
}
この例では省略記号 Catch ハンドラーが確認されているハンドラーです。