结构化异常是什么在这里就不做说明了,这说下在VS2010下如何捕获。
1.配置VS工程属性,以便能够对外抛出这种异常。
工程》右键》属性》配置属性》C/C++》代码生成》启用C++异常》选择“是,但有 SEH 异常 (/EHa)”
2.捕获异常
这里介绍两种方式:
1)将结构化异常转换为C++异常,利用try..catch来捕获
结构化异常转换C++异常代码:
#define MapSEx2CppEx() CSE::MapSE2CE()
class CSE
{
public:
// 结构化异常转换成 C++ 异常.
static void MapSE2CE() {_set_se_translator(TranslateSE2CE);}
DWORD GetExpCode() {return m_pPep->ExceptionRecord->ExceptionCode;}
CSE(PEXCEPTION_POINTERS pep)
: m_pPep(pep)
{
}
static void _cdecl TranslateSE2CE(UINT ec, PEXCEPTION_POINTERS pep) {throw CSE(pep);}
public:
PEXCEPTION_POINTERS m_pPep;
};
捕获:
MapSEx2CppEx();
try
{
//可能产生异常的代码
}
catch (CSE& se)
{
}
2)利用windows提供的向量化异常处理机制
LONG WINAPI GetException(PEXCEPTION_POINTERS ep)
{
printf("some execption\n");
return EXCEPTION_CONTINUE_SEARCH;
}
//下面这句话可以写在任何地方,全工程写一次就行(当然,必须写在可能产生异常代码的前面)
//这样工程任何地方,只要产生异常,都会首先进入MyUnhandledExceptionFilter
AddVectoredExceptionHandler(1, GetException);