上一篇文章中詳細講了講C++異常處理模型的trycatch使用語法,其中catch關(guān)鍵字是用來定義catch block的,它后面帶一個參數(shù),用來與異常對象的數(shù)據(jù)類型進行匹配。注意catch關(guān)鍵字只能定義一個參數(shù),因此每個catch block只能是一種數(shù)據(jù)類型的異常對象的錯誤處理模塊。如果要想使一個catch block能抓獲多種數(shù)據(jù)類型的異常對象的話,怎么辦?C++標(biāo)準(zhǔn)中定義了一種特殊的catch用法,那就是” catch(…)”。
感性認(rèn)識
1、catch(…)到底是一個什么樣的東東,先來個感性認(rèn)識吧!看例子先:
int main()
{
try
{
cout << "在 try block 中, 準(zhǔn)備拋出一個異常." << endl;
//這里拋出一個異常(其中異常對象的數(shù)據(jù)類型是int,值為1)
throw 1;
}
//catch( int& value )
//注意這里catch語句
catch( …)
{
cout << "在 catch(…) block 中, 拋出的int類型的異常對象被處理" << endl;
}
}
2、哈哈!int類型的異常被catch(…)抓獲了,再來另一個例子:
int main()
{
try
{
cout << "在 try block 中, 準(zhǔn)備拋出一個異常." << endl;
//這里拋出一個異常(其中異常對象的數(shù)據(jù)類型是double,值為0.5)
throw 0.5;
}
//catch( double& value )
//注意這里catch語句
catch( …)
{
cout << "在 catch(…) block 中, double類型的異常對象也被處理" << endl;
}
}
3、同樣,double類型的異常對象也被catch(…)塊抓獲了。是的,catch(..)能匹配成功所有的數(shù)據(jù)類型的異常對象,包括C++語言提供所有的原生數(shù)據(jù)類型的異常對象,如int、double,還有char*、int*這樣的指針類型,另外還有數(shù)組類型的異常對象。同時也包括所有自定義的抽象數(shù)據(jù)類型。例程如下:
int main()
{
try
{
cout << "在 try block 中, 準(zhǔn)備拋出一個異常." << endl;
//這里拋出一個異常(其中異常對象的數(shù)據(jù)類型是char*)
char* p=0;
throw p;
}
//catch( char* value )
//注意這里catch語句
catch( …)
{
cout << "在 catch(…) block 中, char*類型的異常對象也被處理" << endl;
}
}
int main()
{
try
{
cout << "在 try block 中, 準(zhǔn)備拋出一個異常." << endl;
//這里拋出一個異常(其中異常對象的數(shù)據(jù)類型是int[])
int a[4];
throw a;
}
//catch( int value[] )
//注意這里catch語句
catch( …)
{
cout << "在 catch(…) block 中, int[]類型的異常對象也被處理" << endl;
}
}
4、對于抽象數(shù)據(jù)類型的異常對象。catch(…)同樣有效,例程如下:
class MyException
{
public:
protected:
int code;
};
int main()
{
try
{
cout << "在 try block 中, 準(zhǔn)備拋出一個異常." << endl;
//這里拋出一個異常(其中異常對象的數(shù)據(jù)類型是MyException)
throw MyException();
}
//catch(MyException& value )
//注意這里catch語句
catch( …)
{
cout << "在catch(…) block中, MyException類型的異常對象被處理" << endl;
}
}
對catch(…)有點迷糊?
1、究竟對catch(…)有什么迷糊呢?還是看例子先吧!
void main()
{
int* p = 0;
try
{
// 注意:下面這條語句雖然不是throw語句,但它在執(zhí)行時會導(dǎo)致系統(tǒng)
// 出現(xiàn)一個存儲保護錯誤的異常(access violation exception)
*p = 13; // causes an access violation exception;
}
catch(...)
{
//catch(…)能抓獲住上面的access violation exception異常嗎?
cout << "在catch(…) block中" << endl;
}
}
感性認(rèn)識
1、catch(…)到底是一個什么樣的東東,先來個感性認(rèn)識吧!看例子先:
int main()
{
try
{
cout << "在 try block 中, 準(zhǔn)備拋出一個異常." << endl;
//這里拋出一個異常(其中異常對象的數(shù)據(jù)類型是int,值為1)
throw 1;
}
//catch( int& value )
//注意這里catch語句
catch( …)
{
cout << "在 catch(…) block 中, 拋出的int類型的異常對象被處理" << endl;
}
}
2、哈哈!int類型的異常被catch(…)抓獲了,再來另一個例子:
int main()
{
try
{
cout << "在 try block 中, 準(zhǔn)備拋出一個異常." << endl;
//這里拋出一個異常(其中異常對象的數(shù)據(jù)類型是double,值為0.5)
throw 0.5;
}
//catch( double& value )
//注意這里catch語句
catch( …)
{
cout << "在 catch(…) block 中, double類型的異常對象也被處理" << endl;
}
}
3、同樣,double類型的異常對象也被catch(…)塊抓獲了。是的,catch(..)能匹配成功所有的數(shù)據(jù)類型的異常對象,包括C++語言提供所有的原生數(shù)據(jù)類型的異常對象,如int、double,還有char*、int*這樣的指針類型,另外還有數(shù)組類型的異常對象。同時也包括所有自定義的抽象數(shù)據(jù)類型。例程如下:
int main()
{
try
{
cout << "在 try block 中, 準(zhǔn)備拋出一個異常." << endl;
//這里拋出一個異常(其中異常對象的數(shù)據(jù)類型是char*)
char* p=0;
throw p;
}
//catch( char* value )
//注意這里catch語句
catch( …)
{
cout << "在 catch(…) block 中, char*類型的異常對象也被處理" << endl;
}
}
int main()
{
try
{
cout << "在 try block 中, 準(zhǔn)備拋出一個異常." << endl;
//這里拋出一個異常(其中異常對象的數(shù)據(jù)類型是int[])
int a[4];
throw a;
}
//catch( int value[] )
//注意這里catch語句
catch( …)
{
cout << "在 catch(…) block 中, int[]類型的異常對象也被處理" << endl;
}
}
4、對于抽象數(shù)據(jù)類型的異常對象。catch(…)同樣有效,例程如下:
class MyException
{
public:
protected:
int code;
};
int main()
{
try
{
cout << "在 try block 中, 準(zhǔn)備拋出一個異常." << endl;
//這里拋出一個異常(其中異常對象的數(shù)據(jù)類型是MyException)
throw MyException();
}
//catch(MyException& value )
//注意這里catch語句
catch( …)
{
cout << "在catch(…) block中, MyException類型的異常對象被處理" << endl;
}
}
對catch(…)有點迷糊?
1、究竟對catch(…)有什么迷糊呢?還是看例子先吧!
void main()
{
int* p = 0;
try
{
// 注意:下面這條語句雖然不是throw語句,但它在執(zhí)行時會導(dǎo)致系統(tǒng)
// 出現(xiàn)一個存儲保護錯誤的異常(access violation exception)
*p = 13; // causes an access violation exception;
}
catch(...)
{
//catch(…)能抓獲住上面的access violation exception異常嗎?
cout << "在catch(…) block中" << endl;
}
}

