C++和结构化异常处理

以下摘自《windows核心编程》,不做过多说明直接看代码吧。

 


#include 
" stdafx.h "
#include 
< windows.h >
using   namespace  std;

class  Exception
{
public:
    
static void MapSEtoCE(void ) {_set_se_translator(TranslateSEtoCE); }
    
operator DWORD() return er.ExceptionCode; }

private:
    Exception(PEXCEPTION_POINTERS pep)
    
{
        er 
= *pep->ExceptionRecord;
        tx 
= *pep->ContextRecord;
    }


    
static void _cdecl TranslateSEtoCE(UINT dwEC, PEXCEPTION_POINTERS pep)
    
{
        
throw Exception(pep );
    }


private:
    EXCEPTION_RECORD er;
    CONTEXT tx;
}
;

int  _tmain( int  argc, _TCHAR *  argv[])
{
    Exception::MapSEtoCE();
    
try{
        
*(byte*)0 = 0;    // Access violation
        int x = 0;
        x 
= 5 / x;        // Division by zero
    }

    
catch(Exception se)
    
{
        
switch(se)
        
{
        
case EXCEPTION_ACCESS_VIOLATION:
            
{
                cout 
<< "Access Violation" << endl;
            }

            
break;
        
case EXCEPTION_INT_DIVIDE_BY_ZERO:
            
{
                cout 
<< "Division by zero" << endl;
            }

            
break;
        
default:
            
{
                cout 
<< "Error code:" << se << " Unknown exception" << endl;
            }

            
break;
        }

    }

    
return 0;
}

 

应该可以捕获所有异常。包括已知的、未知的和无法预料的。

需要在setting中c/c++=> project   option中添加   /EHa   .否则.release时会初VC++优化掉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值