#author("2017-01-18T05:42:28+00:00","default:nitta","nitta") [[C++]] * C++/Exception [#ke845b97] -例外は実行を例外ハンドラに移す機能である。 -例外はスレッド毎に存在する。 -実行ではオブジェクトを投げることができる。 -例外ハンドラに実行を移すには、tryブロックの中か、tryブロッックの中で呼ばれている関数の中で throw 文を用いる。 - goto文, break 文, return 文, continue 文を用いて、tryブロックとハンドラの内側から外側に抜けることができる。 - throw式はオペランドから例外オブジェクトを一時オブジェクトとして初期化する。 例外オブジェクトの型を決定するには、throw式のオペランドの型からトップレベルの CV 修飾子を取り除き、T型への配列型はTへのポインタ型へ、T型を返す関数型は T型を返す関数へのポインタ型に変換する。 throw 0; // int int const a = 0; throw a; // int int const volatile * const volatile p = &a; throw p; // int const volatile * int b[5]; throw b; // int * int f(int); throw f; // int (*)() **例外の補足 (Handling an excption) [#n8218e4f] 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 の場合