throw()使用小結

爲什麼要加一個throw()到你的函數中?
這是異常規範,只會出現在聲明函數中,表示這個函數可能拋出任何類型的異常
void GetTag() throw(int);表示只拋出int類型異常
void GetTag() throw(int,char);表示拋出in,char類型異常
void GetTag() throw();表示不會拋出任何類型異常
void GetTag() throw(...);表示拋出任何類型異常
void GetTag() throw(int);表示只拋出int類型異常
並不表示一定會拋出異常,但是一旦拋出異常只會拋出int類型,如果拋出非
int類型異常,調用unexsetpion()函數,退出程序。
假如你加一個throw()屬性到你的永遠不會拋出異常的函數中,編譯器會非常聰明的知道代碼的意圖和決定優化方式。考慮下面的代碼:
class MyClass
{
    size_t CalculateFoo()
    {
        :
        :
    };
    size_t MethodThatCannotThrow() throw()
    {
        return 100;
    };
    void ExampleMethod()
    {
        size_t foo, bar;
        try
        {
            foo = CalculateFoo();
            bar = foo * 100;
            MethodThatCannotThrow();
            printf(\"bar is %d\", bar);
        }
        catch (...)
        {
        }
    }
};
當編譯器看到這個帶\"throw()\"屬性代碼的時候,編譯能夠優化這個\"bar\"變量,因爲它知道從MethodThatCannotThrow()函數中不會拋出任何的異常。如果沒有這個throw()屬性,編譯器必須創建這個\"bar\"變量,因爲假如MethodThatCannotThrow拋出了一個異常,這個異常句柄可能會需要依靠這個bar變量。
另外,象prefast源代碼分析工具能夠(也會)用throw()註釋去優化他們的錯誤檢測能力----舉個例子,假如你有一個try/catch而且所有調用的函數都已經標記了throw(),實際上你不需要這個try/catch(是的,假如你最後調用的函數可能拋出異常這就會有個問題了)。
發佈了8 篇原創文章 · 獲贊 9 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章