第3集C++中catch(…)如何使用

字號:

上一篇文章中詳細講了講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;
    }
    }