這是異常規範,只會出現在聲明函數中,表示這個函數可能拋出任何類型的異常
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(是的,假如你最後調用的函數可能拋出異常這就會有個問題了)。