unexpected() のデフォルトの動作は、関数 set_unexpected() を呼び出すことによって変更できます。
// 宣言は標準ヘッダー <exception> に含まれる namespace std { class exception; class bad_exception; typedef void (*unexpected_handler)(); unexpected_handler set_unexpcted(unexpected_handler f) throw(); void unexpected(); }
unexpected() 関数は、関数がその例外指定にない例外によって終了しようとする場合に呼び出されます。unexpected() のデフォルト版は、terminate() を呼び出します。
ユーザーが変更した unexpected() は、例外指定が許可している例外も送出することがあります。このような場合の例外処理は、その例外が実際に元の関数から送出されたかのように継続します。変更後の unexpected() がそれ以外の例外を送出した場合は、その例外は標準の例外 std::bad_exception に置換されます。元の関数の例外指定が std::bad_exception を許可しない場合は、直後に関数 terminate() が呼び出されます。それ以外では、元の関数が実際に std::bad_exception を送出したかのように例外処理が継続します。
unexpected() は set_unexpected() に引数として渡された関数を呼び出します。このような関数は、パラメータを持たず、値を返すこともありません。このような関数はその呼び出し元に戻ってはなりません。set_unexpected() への最後の呼び出しで渡された関数が呼び出されるようになります。以前の set_unexpected() の呼び出し時に引数として渡された関数が戻り値になります。そのため set_unexpected() を使用し、今までに登録された関数を順次呼び出すようにプログラミングすることができます。
unexpected()の代わりに呼び出し元に戻る関数を選択するとエラーになります。