结构化异常是什么在这里就不做说明了,这说下在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);