第二十三章 终止处理程序

①SEH (structured excepttion handling)结构化异常处理 {终止处理程序,异常处理程序}

 终止处理程序:__try{/*try块*/}__finally{/*finally块*/}

②为什么使用结构化异常处理?

  • 清理工作集中在一个地方执行,保证得到执行
  • 可以提高代码可读性
  • 让代码更容易维护
  • 正确使用对程序性能和体积的影响是很小的

③清理工作集中在一个地方执行,保证得到执行例子 

  //try+finaly+leave应用例子//__leave导致代码执行控制跳转到try块的结尾。

DWORD SEHExample()
{
    HANDLE hfile = INVALID_HANDLE_VALUE;
    PVOID pvBuf = NULL;

    BOOL bReturn = FALSE;
    __try
        {
            DWORD dwNumBytesRead;
            BOOL bOk;
            hfile = CreateFile(TEXT("SOMEDATA.DAT"),GENERIC_READ,
                FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
            if (hfile == NULL)
            {
                __leave;
            }

            pvBuf = VirtualAlloc(NULL,1024,MEM_COMMIT,PAGE_EXECUTE_READ);
            if(pvBuf == NULL)
            {
                __leave;
            }

            bOk =ReadFile(hfile,pvBuf,1024,&dwNumBytesRead,NULL)
            if(!bOk || (dwNumBytesRead == 0))
            {
                __leave;
            }

            bReturn = TRUE;
        }
    __finally
    {
        if (pvBuf != NULL)
        {
            VirtualFree(pvBuf,MEM_RELEASE|MEM_DECOMMIT);
            pvBuf = NULL;
        }

        if (hfile != INVALID_HANDLE_VALUE)
        {
            CloseHandle(hfile);
            hfile = NULL;
        }
    }
    return bReturn;
}
__finaly注意事项
  • try块到finally的正常代码控制流
  • 局部展开:try中的提前退出 (goto,longjump,continue,break,return)强制进入finally块。
  • 全局展开:后两章详解
原文地址:https://www.cnblogs.com/WillingCPP/p/3074414.html