c++ 结构化异常处理(SEH)

1.使用__try __finally的情形:

下面的调用,如果FunX出现异常,导致m_hMem没有释放。

void Fun1()
{
    // dosth...
    FunX();
    
    WaitForSingleObject(m_hMem, INFINITE);
    
    CloseHandle(m_hMem);
}

使用try finally修改如下:

void Fun2()
{
    // dosth
    __try
    {
        FunX();
        WaitForSingleObject(m_hMem, INFINITE);        
    }
    __finally
    {
        CloseHandle(m_hMem);
    }
}

2.优化代码结构

类似下面的函数代码结构复杂

void Fun3()
{
    HRESULT hres = NULL;
	IWbemLocator *pLoc = 0;
    IWbemServices *pSvc = 0;
    hres = CoInitializeEx(0, COINIT_APARTMENTTHREADED);
    if (FAILED(hres))
    {
        return 0;
    }
    hres = CoInitializeSecurity(NULL, -1, ...);
    if (FAILED(hres))
    {
        CoUninitialize();
        return 0;
    } 
    hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&pLoc);
    if (FAILED(hres))
    {
        CoUninitialize();
        return 0;
    }
    hres = pLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), ...);
    if (FAILED(hres))
    {
        pLoc->Release();
        CoUninitialize();
        return 0; 
    }
	
    // dosth
    ...
	
	return 1;
}

使用try finally

void Fun3()
{
	bool bInitOk = false;
    HRESULT hres = NULL;
	IWbemLocator *pLoc = 0;
    IWbemServices *pSvc = 0;
	__try
	{
		hres = CoInitializeEx(0, COINIT_APARTMENTTHREADED);
		if (FAILED(hres))
		{
			__leave
		}
		
		bInitOk = true;
		hres = CoInitializeSecurity(NULL, -1, ...);
		if (FAILED(hres))
		{
			__leave
		} 
		hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&pLoc);
		if (FAILED(hres))
		{
			__leave
		}
		hres = pLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), ...);
		if (FAILED(hres))
		{
			__leave
		}
		
		// dosth
		...
	}
	__finally
	{
		if (pLoc != 0)
			pLoc->Release();
		if (pSvc != 0)
			pSvc->Release();
		if (bInitOk)
			CoUninitialize();
		if (FAILED(hres))
			return 0;
	}
	
	return 1;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值