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

字號(hào):

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