异常处理分两种,一种是语言的异常处理,这个异常处理是由语言的语法标准规定的,任何平台通用,只要编译器支持;一种是系统的异常处理,这个是由系统提供的,不是语言的特性,而是平台的特性,Windows下的系统异常处理,放到Linux下就没法使用了。
C++语言的异常处理,是用于处理语言本身的一些问题,如指针为空、如除数为0,之类的。这没什么多说的。
try
{
//可能抛出异常的语句
}
catch (异常类型1 异常对象)
{
//针对异常类型1的异常处理
}
catch (异常类型2 异常对象)
{
//针对异常类型2的异常处理
}
catch (...)
{
//针对其他异常类型的异常处理
}
重点要描述的是系统的异常处理。
语言的异常处理并没有办法catch住所有的异常。比如在用VS开发时,有时会碰到“未处理的异常”,然后弹出一个框,代码停在出错的地方。类似于内存访问越界之类的。这种由系统报出的异常,即使在错误代码段加入了try-catch也没有效果,因为这种错是没有办法用try-catch捕获的。通常我们可以解决掉这个异常,让它不再出错,但是总会有没有发现的地方,所以需要捕获系统异常。
为了要捕获Windows系统抛出的异常,就需要用到Windows的一套异常捕获。
int filter(unsigned int code, struct _EXCEPTION_POINTERS *ep)
{
if (code == EXCEPTION_ACCESS_VIOLATION)
{
//
return EXCEPTION_EXECUTE_HANDLER;
}
//........
else
{
//
return EXCEPTION_CONTINUE_SEARCH;
};
}
void TestFunction()
{
__try
{
//保护区域
}
__except(filter(GetExceptionCode(), GetExceptionInformation()))
{
//
}
__finally
{
//
}
}
这样就可以捕获到系统的异常了。