第5集C++的異常rethrow

字號:

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