第5集C++的異常rethrow

字號(hào):

上一篇文章已經(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;
    }
    }