2018年01月09日
《その225》 例外指定
※例外指定は、C++ で使用が推奨されていない機能です。
例えば、下記の関数 set_unexpected はC++11から非推奨となり、C++17で削除されました。
本ブログでは、通常は、Visual C++ 2017 でコンパイルを行っていますが、VC++ は例外指定に対応していないため、今回《225》のコンパイルには、Eclipse を使いました。
例外指定
関数宣言の際に、「 throw(例外型) 」 のような例外指定と呼ばれる記述を付加することで、その関数が送出する可能性がある例外を明示することができます。
例えば、
void func1() throw(int, char) { ・・・・・・ }
は、関数 func1 が送出する可能性のある例外が、int型例外と char型例外であることを示しています。
そして、もし、この例外指定で指定されていない型の例外、すなわち、int型でも char型でもない例外を、関数 func1 が送出しようとすると、次の (1) 〜 (3) のステップが踏まれることになります。
(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関数で、デフォルトでない関数を指令する場合、新たな指定関数は、
呼び出し元に戻ることなくプログラムを終了するものでなければなりません。
// ------------------------------------
#include <exception>
#include <iostream>
using namespace std;
void f() throw(int) { // int型の例外指定
throw ' ';
// 例外指定に反してchar型の例外を送出。
}
void tmp_handler() {
// 自作のハンドラ関数
std::cout << "例外指定に違反しました!"
"\n";
exit(1);
}
int main() {
set_unexpected(tmp_handler);
// unexpected_handle を tmp_handler に
// 交換。
f();
}
// ------------------------------------
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7175210
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック