以前有这么个问题,如果代码不小心发生了一个异常,比如除零异常,但我不想让代码就此弹框结束,我想让代码忽略掉这个异常继续运行,那应该怎么办?
try
{
int a=1;
int b=0;
int c=a/b;
}
catch()
{
printf("Ignore that error and continue to work!\n");
}
这段代码并不奏效,因为除零错误是一个系统异常,而不是一个C++类型异常,所以catch不到的,这种异常类型也就没法通过这种方式来处理了。必须用Windows特有的异常处理方式:
__try
{
int a=1;
int b=0;
int c=a/b;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
printf("Ignore that error and continue to work!\n");
}
这样就没有问题了,而且我们可以在__except中调用GetExceptionCode来获得异常代码,比如这个例子的异常代码是0xC0000094,表示“整型除零异常”。试图访问一个非法地址导致的异常也同样可以通过这种方式来捕捉到。例如:
__try
{
int* p = NULL;
*p = 10;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
printf("Exception[%0X] occured!\n", GetExceptionCode());
}
异常代码0xC0000005,这个我们见得太多了,也就是非法地址访问异常。
这种方式的异常处理还有个妙用,那就是用来取代goto语句。大致这样:
__try
{
BOOL rtn = Foo1();
if(!rtn)
__leave;
rtn = Foo2();
if(!rtn)
__leave;
//Blah Blah Blah
}
__finally
{
//Do some job to release the resources.
}
进一步信息请查看MSDN,查找“__try”等关键字就可以了。
值得注意的是,这种方式的异常处理不能和C++风格的异常处理同时使用,否则会编译通不过。