• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            旅途

            如果想飛得高,就該把地平線忘掉

            異常規范

            異常異常規范exception specification 提供
            了一種方案它能夠隨著函數聲明列出該函數可能拋出的異常它保證該函數不會拋出任何
            其他類型的異常
            異常規范跟隨在函數參數表之后它用關鍵字throw 來指定后面是用括號括起來的異
            常類型表例如我們可以如下修改iStack 類的成員函數的聲明以增加適當的異常規范
            class iStack {
            public:
            // ...
            void pop( int &value ) throw(popOnEmpty);
            void push( int value ) throw(pushOnFull);
            private:
            // ...
            };

            如果函數聲明指定了一個異常規范,則同一函數的重復聲明必須指定同一類型的異常規
            范,同一函數的不同聲明上的異常規范是不能累積的。例如
            // 同一函數的兩個聲明
            extern int foo( int = 0 ) throw(string);
            // 錯誤: 異常規范被省略
            extern int foo( int parm ) { }

            如果函數拋出了一個沒有被列在異常規范中的異常會怎么樣程序只有在遇到某種不正
            常情況時異常才會被拋出在編譯時刻編譯器不可能知道在執行時程序是否會遇到這些
            異常因此一個函數的異常規范的違例只能在運行時刻才能被檢測出來如果函數拋出了
            一個沒有被列在其異常規范中的異常則系統調用C++標準庫中定義的函數unexpected()
            unexpected()的缺省行為是調用terminate() 在某些條件下可能有必要改變unexpected()
            執行的動作C++標準庫提供了一種機制可讓我們改變unexpected()的缺省行為

            1 空的異常規范保證函數不會拋出任何異常例如函數no_problem()保證不會拋出任何
            異常
            extern void no_problem() throw();
            2 如果一個函數聲明沒有指定異常規范則該函數可以拋出任何類型的異常
            在被拋出的異常類型與異常規范中指定的類型之間不允許類型轉換。例如
            int convert( int parm ) throw(string)
            {
            // ...
            if ( somethingRather )
            // 程序錯誤:
            // convert() 不允許 const char* 型的異常
            throw "help!";
            }
            在函數convert()中的throw 表達式拋出一個C 風格的字符串由這個throw 表達式創建
            的異常對象的類型為const char* 通常const char*型的表達式可以被轉換成string 類型
            但是異常規范不允許從被拋出的異常類型到異常規范指定的類型之問的轉換如果convert()
            拋出該異常則調用函數unexpected() 為了修正這種情況可以如下修改throw 表達式
            顯式地把表達式的值轉換成string 類型
            throw string( "help!" );
            3
            我們也可以在函數指針的聲明處給出一個異常規范例如
            void (*pf) (int) throw(string);
            該聲明表示pf 是一個函數指針它只能拋出string 類型的異常和函數聲明一樣同一
            指針的不同異常規范不能累積指針pf 的所有聲明都必須指定相同的規范例如
            extern void (*pf)( int ) throw(string);
            // 錯誤: 缺少異常規范
            void (*pf) ( int );
            void recoup( int, int ) throw(exceptionType);
            void no_problem() throw();
            void doit( int, int ) throw(string, exceptionType);
            // ok: recoup() 與 pf1 的異常規范一樣嚴格
            void (*pf1)( int, int ) throw(exceptionType) = &recoup;
            // ok: no_problem() 比 pf2 更嚴格
            void (*pf2)() throw(string) = &no_problem;
            // 錯誤: doit()沒有 pf3 嚴格
            void (*pf3)( int, int ) throw(string) = &doit;

            posted on 2007-09-29 00:39 旅途 閱讀(577) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

            久久精品国产亚洲欧美| 久久av无码专区亚洲av桃花岛| 国产精品免费久久| 久久国产三级无码一区二区| 深夜久久AAAAA级毛片免费看| 久久这里只有精品首页| 久久av无码专区亚洲av桃花岛| 91亚洲国产成人久久精品网址| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 久久天天躁狠狠躁夜夜不卡| 久久99国产精品久久99小说| 99久久国产精品免费一区二区 | 国产69精品久久久久99尤物| 色播久久人人爽人人爽人人片aV| 97精品依人久久久大香线蕉97| 欧美亚洲另类久久综合| 久久久久国产精品人妻| 国产精品永久久久久久久久久| 亚洲国产精品无码久久久蜜芽| 久久亚洲2019中文字幕| 91精品国产综合久久久久久| 久久亚洲国产精品123区| 欧美一区二区三区久久综合| 亚洲国产成人久久精品99| 久久夜色精品国产亚洲| 久久99精品久久久久久久久久| 精品国产乱码久久久久软件| 国产免费久久精品99久久| 久久久久久综合一区中文字幕| 日本人妻丰满熟妇久久久久久| 国产精品久久久久蜜芽| 欧美久久一区二区三区| 91久久精品国产91性色也| 久久se精品一区二区| av无码久久久久久不卡网站 | 久久天天婷婷五月俺也去| 久久久久久国产精品美女| 国产精品成人99久久久久| 嫩草影院久久国产精品| 狠狠色丁香婷婷综合久久来| 国产日产久久高清欧美一区|