構造化例外を 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();
}
リンク