以前有這么個問題,如果代碼不小心發生了一個異常,比如除零異常,但我不想讓代碼就此彈框結束,我想讓代碼忽略掉這個異常繼續運行,那應該怎么辦?
這種方式的異常處理還有個妙用,那就是用來取代goto語句。大致這樣:
值得注意的是,這種方式的異常處理不能和C++風格的異常處理同時使用,否則會編譯通不過。
try
{
int a=1;
int b=0;
int c=a/b;
}
catch(
)
{
printf("Ignore that error and continue to work!\n");
}
這段代碼并不奏效,因為除零錯誤是一個系統異常,而不是一個C++類型異常,所以catch不到的,這種異常類型也就沒法通過這種方式來處理了。必須用Windows特有的異常處理方式:{
int a=1;
int b=0;
int c=a/b;
}
catch(

{
printf("Ignore that error and continue to work!\n");
}
__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,表示“整型除零異常”。試圖訪問一個非法地址導致的異常也同樣可以通過這種方式來捕捉到。例如:{
int a=1;
int b=0;
int c=a/b;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
printf("Ignore that error and continue to work!\n");
}
__try
{
int* p = NULL;
*p = 10;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
printf("Exception[%0X] occured!\n", GetExceptionCode());
}
異常代碼0xC0000005,這個我們見得太多了,也就是非法地址訪問異常。{
int* p = NULL;
*p = 10;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
printf("Exception[%0X] occured!\n", GetExceptionCode());
}
這種方式的異常處理還有個妙用,那就是用來取代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”等關鍵字就可以了。{
BOOL rtn = Foo1();
if(!rtn)
__leave;
rtn = Foo2();
if(!rtn)
__leave;
//Blah Blah Blah

}
__finally
{
//Do some job to release the resources.
}
值得注意的是,這種方式的異常處理不能和C++風格的異常處理同時使用,否則會編譯通不過。