在初学VC的时候,总以为try()catch(...)可以抓到所有的异常. 在开发之前开发的一个服务器程序中,才发现服务器经常莫名其妙的宕机了.一直觉得很诡异.
直到后来看了很多资料才明白结构化异常跟C++异常是两套东西,不统一。有些异常try.catch不一定能不抓到. 要将两种异常共同使用.下面的代码可以达到目的. 使用下面异常类,可以使程序更稳定.(注意:编译选项里面要记得打开 结构化异常开关. compile with: /EHa)
- // 把结构化异常转化为C++异常
- struct SException
- {
- EXCEPTION_RECORD er;
- CONTEXT context;
- SException(PEXCEPTION_POINTERS pep)
- {
- er = *(pep->ExceptionRecord);
- context = *(pep->ContextRecord);
- }
- operator DWORD() { return er.ExceptionCode; }
- static void MapSEtoCE() { _set_se_translator( TranslateSEToCE ); }
- static void __cdecl TranslateSEToCE( UINT dwEC, PEXCEPTION_POINTERS pep )
- {
- throw SException(pep);
- }
- };
- void main()