第46章 ハンドルされない例外

 第2部第46章でキャッチされない例外について話しました。今回はその発展です。


 では、今回の要点です。


 では、いってみましょう。


 第2部第46章では、例外がキャッチされなかった場合はエラー終了するといいました。この時のエラーメッセージが abort のものと一緒だということに気がついた人もいるでしょう。

 これはその通りで、例外がキャッチされなければ abort されます。したがってデストラクタも呼ばれませんし、終了処理もされません。

 強制終了すること自体は特に問題はないのですが、それ以外に終了処理を付け加えてやりたいときもあるかも知れません。もしくは、abort ではなく exit したいときもあるかも知れません。

 そういうときのために、実はこの処理を変更することも出来ます。処理をどう変えても必ず強制終了はされるのですが、その前に何か処理を加えることが出来ます。その処理を変えるための関数が set_terminate です。

 では、次のプログラムを見て下さい。

プログラム
// Term1.cpp
#include <iostream.h>
#include <stdlib.h>
#include <eh.h>  // set_terminate を使うのに必要です

void NewTerminate()
{
    cout << "異常終了です!" << endl;
    exit(1);  // これを書かなければ abort されます
}

int main()
{
    set_terminate(NewTerminate);
    throw 1;

    return 0;
}
実行結果
異常終了です!

 このように、戻り値の型が void で引数のない関数を set_terminate で設定してやれば、キャッチされない(ハンドルされないともいう)例外の処理を自分で決めてやることができるわけです。

 ただし、これは throw で投げられた例外にしか反応しません。0除算とか不正アクセス(例えば NULL の入ったポインタで参照したときなど)とかの例外を処理することはできません。

 あと、例外を処理するもののことを「例外ハンドラ」と呼びます。ヘッダファイル名 eh.h も、exception handler(例外ハンドラ)の略でしょう。

 また、こういう処理を作ると、例外を投げずに異常終了するときもこの関数を使うと一貫性が保てます。そういう場合はこの関数を直接呼ばずに、terminate という関数を使います。terminate を呼べば、例外がハンドルされなかったときと全く同じ処理を行ってくれます。terminate も eh.h で宣言されています。


 補足ですが、gcc では set_terminate, terminate の宣言は exception ヘッダファイルにあります。std という名前空間(第2部第50章参照)の中で宣言されています。

 最近の回はVC++と gcc との違いがよく現れるので、読む方も書く方も大変です(汗)。他の環境で動かなかった場合は、まだサポートされていないか、別のヘッダファイルにあるかのどちらかと思います。全てに対応するのは不可能なので、その場合は何とか自力で解決してください。それはそれでいい経験になると思います。


 極端に短い回ですが、今回はこれで終わりです。嘘じゃありません。その証拠に、今回の要点です。


 それでは、また。


第45章 マクロの落穂拾い | 第47章 C±±

Last update was done on 2001.5.6

この講座の著作権はロベールが保有しています