2018年01月15日
《その235》 bad_exception例外
bad_exception例外
bad_exception例外は、exception からの public派生クラスです。
この bad_exception例外は、関数が例外指定に違反した例外を送出しようとしたときに、送出されます。
( 例外指定については、本ブログ《225》をご参照ください。)
以下は、《225》からの抜粋です。
例外指定違反が起きた場合
(1) bad_exception例外が送出されて unexpected関数が呼び出されます。
(2) unexpected関数は、デフォルトの unexpected_handler型関数を呼び出し、次いで、terminate関数が呼び出されます。
(3) terminate関数 は、abort() を呼び出し、これによりプログラムは終了します。
ここで、上記 (2) の、デフォルトの unexpected_handler型関数を、set_unexpected関数を使って置き換えることが可能です。
また、上記 (3) の terminate関数のデフォルト指定関数についても、set_terminate関数を使用して置き換えることが可能です。
※ set_unexpected(f1) の引数 f1 が unexpected関数によって 呼び出される関数になり、
set_terminate(f2) の引数 f2 が terminate関数によって 呼び出される関数になります。
ただし、set_terminate関数で、デフォルトでない関数を指令する場合、新たな指定関数は、
呼び出し元に戻ることなくプログラムを終了するものでなければなりません。
本ブログの《225》で考えたプログラムは、set_unexpected関数を用いて、unexpected関数が呼び出す関数を変更するものでした。
今回のプログラム(下記)では、前回と同じく、
set_unexpected関数を用いて、unexpected関数が呼び出す関数を変更したうえで、さらに
set_terminate関数を用いて、terminate関数が呼び出す関数を変更しています。
※ VC++ は例外指定に対応していないため、今回のコンパイルには、Eclipse を使いました。
#include <exception>
#include <iostream>
using namespace std;
void f() throw(int) { // int型 の例外指定
throw ' ';
// 例外指定に反してchar型の例外を送出し
// たため、bad_exception例外が送出
// されます。
}
void unexpected_tmp_handler() {
// 自作のハンドラ関数
std::cout << "unexpected_tmp_handlerが"
"呼ばれました。\n";
}
void terminate_tmp_handler() {
// 自作のハンドラ関数
std::cout << "terminate_tmp_handlerが"
"呼ばれました。exit(1)で"
"終了します。\n";
exit(1);
}
int main() {
set_unexpected(unexpected_tmp_handler);
// set_unexpected関数で、
// unexpected_tmp_handler を登録。
set_terminate(terminate_tmp_handler);
// set_terminate関数で、
// terminate_tmp_handler を登録。
f(); // 関数 f の呼び出し。
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7199437
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック