構造化例外を try でキャッチ
出典: encom wiki
daisuke 2007年8月25日 (土) 10:18
構造化例外は __try, __except でキャッチします。一方、C++ 例外は try, catch でキャッチします。ところが、__try と try は同時に使えません。
これでは不便です。そこで、構造化例外を C++ 例外に変換することで、try, catch ですべての例外をキャッチできるようにします。要約は以下の通りです。
- std::exception を継承した独自例外クラスを定義。
- _set_se_translator を使って構造化例外発生時に、例外を C++ 例外に変換。
- _set_se_translator を利用できるように /Eha オプションを使用する。
- (プロジェクトプロパティ → 構成プロパティ → C/C++ → コード生成 → C++ の例外を有効にする)
上記の方法で、構造化例外は std::exception を継承した独自クラスになるため、catch(std::exception& e) ですべての例外をキャッチすることもできます。
※_set_se_translator はスレッドごとに定義する必要があります。
Exception.h
#include <exception>
class Exception : public std::exception
{
public:
Exception(void)
: exception()
{
}
~Exception(void)
{
}
};
EntryPoint.cpp
#include "Exception.h"
void se_translator(unsigned int code, _EXCEPTION_POINTERS* information);
//
// エントリポイント
//
int _tmain(int argc, _TCHAR* argv[])
{
// 構造化例外を C++ 例外に変換
_set_se_translator(se_translator);
try
{
}
catch (std::exception& e)
{
}
return 0;
}
//
// 構造化例外を C++ 例外に変換します。
//
void se_translator(unsigned int code, _EXCEPTION_POINTERS* information)
{
throw Exception();
}
