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