C++
C++/Exception †
例外の補足 (Handling an excption) †
catch ( 例外宣言 ) 複合文
例外が投げられると、例外オブジェクトの型と適合する例外宣言を持つハンドラに処理が移る。
ハンドラの例外宣言は、以下の型は禁止されている。
- 不完全型
- 抽象クラス型
- rvalue リファレンス型
- 不完全型へのポインタやリファレンス ---ただし、例外的に許可されているのは void *, const void *, volatile void *, const volatile void *
ハンドラの例外宣言が「Tへの配列」の場合、「Tへのポインタ」に変換される。「Tを返す関数」型は「Tを返す関数へのポインタ」型に変換される。
catch (int[5]) // int *と同じ
catch ( int f( void ) ) // int (*f)(void) と同じ
あるハンドラが、例外オブジェクトの型E と適合する条件。
- ハンドラの型が cv T もしくは cv T & で、EとTが同じ型である場合
- ハンドラの型が cv T もしくは cv T & で、T は E の曖昧性のない public な基本クラスである場合
- ハンドラの型が cv1 T* cv2 で、E がポインタ型で、以下のいずれかの方法でハンドラの型に変換可能な場合。
- 標準ポインタ型変換で、private や protected なポインタへの変換や曖昧なクラスへの変換を伴わないもの。
- ハンドラの型がポインタか、メンバへのポインタで、E が std::nullptr_t の場合