上一篇文章已經(jīng)提到了C++的異常rethrow現(xiàn)象,這篇文章將進(jìn)一步深入討論這個(gè)問(wèn)題。當(dāng)catch到一個(gè)異常后進(jìn)入異常處理程序塊中,此時(shí)需要從傳入的異常對(duì)象中得到一些關(guān)于異常的詳細(xì)信息,并判斷這個(gè)異常是否能得以恢復(fù),是否能在當(dāng)前的異常處理程序塊中得以處理。如果是,那么及時(shí)地處理掉這個(gè)異常,使程序恢復(fù)到正常的工作軌道上(也即從catch block后面的代碼處繼續(xù)執(zhí)行);否則就必須重新拋出異常(Excption Rethrow),把這個(gè)異常交給上一層函數(shù)的異常處理模塊去處理(反正我是處理不了了,而且我也通知了我的上層領(lǐng)導(dǎo),所以責(zé)任嗎,也就不由我擔(dān)當(dāng)了,哈哈 ^-^)。
語(yǔ)法
很簡(jiǎn)單,有兩種用法,如下:
1、 throw ;
2、 throw exception_obj ;
第一種表示原來(lái)的異常對(duì)象再次被重新拋出;第二中呢,則表示原來(lái)的異常已處理或正在處理中,但此時(shí)又引發(fā)了另一個(gè)異常。示例如下:
void main()
{
try
{
try
{
throw 4;
}
catch(int value)
{
// 第一種用法,原來(lái)的異常被再次拋出
// 注意它不需要帶參數(shù)。
throw;
}
try
{
throw 0.5;
}
catch(double value)
{
// 第二種用法,再次拋出另外的一個(gè)異常
// 它的語(yǔ)法和其它正常拋出異常的語(yǔ)法一樣。
throw “another exception”;
}
}
catch(...)
{
cout << “unknow exception”<< endl;
}
}
在什么地方異??梢詒ethrow?
當(dāng)然,異常的rethrow只能在catch block中,或者說(shuō)在catch block中拋出的異常才是異常的rethrow,因此注意下面的示例程序中存在語(yǔ)法錯(cuò)誤,如下:
void main()
{
try
{
try
{
throw 4;
}
catch(int value)
{
// 這里的語(yǔ)法是對(duì)的。
throw;
}
// 但這里的語(yǔ)法卻是不對(duì)的。
// 不能在這里進(jìn)行異常的rethrow
throw;
}
catch(...)
{
cout << “unknow exception”<< endl;
}
}
異常rethrow需要注意的問(wèn)題!
異常rethrow需要注意什么問(wèn)題呢?看例子先!
void main()
{
try
{
try
{
throw 4;
}
catch(int value)
{
// 異常的rethrow
throw;
}
catch(...)
{
cout << “能打印我這條消息嗎?”<< endl;
}
}
catch(...)
{
cout << “unknow exception”<< endl;
}
}
語(yǔ)法
很簡(jiǎn)單,有兩種用法,如下:
1、 throw ;
2、 throw exception_obj ;
第一種表示原來(lái)的異常對(duì)象再次被重新拋出;第二中呢,則表示原來(lái)的異常已處理或正在處理中,但此時(shí)又引發(fā)了另一個(gè)異常。示例如下:
void main()
{
try
{
try
{
throw 4;
}
catch(int value)
{
// 第一種用法,原來(lái)的異常被再次拋出
// 注意它不需要帶參數(shù)。
throw;
}
try
{
throw 0.5;
}
catch(double value)
{
// 第二種用法,再次拋出另外的一個(gè)異常
// 它的語(yǔ)法和其它正常拋出異常的語(yǔ)法一樣。
throw “another exception”;
}
}
catch(...)
{
cout << “unknow exception”<< endl;
}
}
在什么地方異??梢詒ethrow?
當(dāng)然,異常的rethrow只能在catch block中,或者說(shuō)在catch block中拋出的異常才是異常的rethrow,因此注意下面的示例程序中存在語(yǔ)法錯(cuò)誤,如下:
void main()
{
try
{
try
{
throw 4;
}
catch(int value)
{
// 這里的語(yǔ)法是對(duì)的。
throw;
}
// 但這里的語(yǔ)法卻是不對(duì)的。
// 不能在這里進(jìn)行異常的rethrow
throw;
}
catch(...)
{
cout << “unknow exception”<< endl;
}
}
異常rethrow需要注意的問(wèn)題!
異常rethrow需要注意什么問(wèn)題呢?看例子先!
void main()
{
try
{
try
{
throw 4;
}
catch(int value)
{
// 異常的rethrow
throw;
}
catch(...)
{
cout << “能打印我這條消息嗎?”<< endl;
}
}
catch(...)
{
cout << “unknow exception”<< endl;
}
}