throw()使用小结
生活随笔
收集整理的這篇文章主要介紹了
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()屬性到你的永遠不會拋出異常的函數中,編譯器會非常聰明的知道代碼的意圖和決定優化方式。考慮下面的代碼:
顯示代碼打印01 class MyClass ?
02 { ?
03???? size_t CalculateFoo() ?
04???? { ?
05???????? : ?
06???????? : ?
07???? }; ?
08???? size_t MethodThatCannotThrow() throw() ?
09???? { ?
10???????? return 100; ?
11???? }; ?
12???? void ExampleMethod() ?
13???? { ?
14???????? size_t foo, bar; ?
15???????? try
16???????? { ?
17???????????? foo = CalculateFoo(); ?
18???????????? bar = foo * 100; ?
19???????????? MethodThatCannotThrow(); ?
20???????????? printf("bar is %d", bar); ?
21???????? } ?
22???????? catch (...) ?
23???????? { ?
24???????? } ?
25???? } ?
26 };
當編譯器看到這個帶"throw()"屬性代碼的時候,編譯能夠優化這個"bar"變量,因為它知道從MethodThatCannotThrow()函數中不會拋出任何的異常。如果沒有這個throw()屬性,編譯器必須創建這個"bar"變量,因為假如MethodThatCannotThrow拋出了一個異常,這個異常句柄可能會需要依靠這個bar變量。
另外,象prefast源代碼分析工具能夠(也會)用throw()注釋去優化他們的錯誤檢測能力----舉個例子,假如你有一個try/catch而且所有調用的函數都已經標記了throw(),實際上你不需要這個try/catch(是的,假如你最后調用的函數可能拋出異常這就會有個問題了)。
這是異常規范,只會出現在聲明函數中,表示這個函數可能拋出任何類型的異常
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()屬性到你的永遠不會拋出異常的函數中,編譯器會非常聰明的知道代碼的意圖和決定優化方式。考慮下面的代碼:
顯示代碼打印01 class MyClass ?
02 { ?
03???? size_t CalculateFoo() ?
04???? { ?
05???????? : ?
06???????? : ?
07???? }; ?
08???? size_t MethodThatCannotThrow() throw() ?
09???? { ?
10???????? return 100; ?
11???? }; ?
12???? void ExampleMethod() ?
13???? { ?
14???????? size_t foo, bar; ?
15???????? try
16???????? { ?
17???????????? foo = CalculateFoo(); ?
18???????????? bar = foo * 100; ?
19???????????? MethodThatCannotThrow(); ?
20???????????? printf("bar is %d", bar); ?
21???????? } ?
22???????? catch (...) ?
23???????? { ?
24???????? } ?
25???? } ?
26 };
當編譯器看到這個帶"throw()"屬性代碼的時候,編譯能夠優化這個"bar"變量,因為它知道從MethodThatCannotThrow()函數中不會拋出任何的異常。如果沒有這個throw()屬性,編譯器必須創建這個"bar"變量,因為假如MethodThatCannotThrow拋出了一個異常,這個異常句柄可能會需要依靠這個bar變量。
另外,象prefast源代碼分析工具能夠(也會)用throw()注釋去優化他們的錯誤檢測能力----舉個例子,假如你有一個try/catch而且所有調用的函數都已經標記了throw(),實際上你不需要這個try/catch(是的,假如你最后調用的函數可能拋出異常這就會有個問題了)。
轉載于:https://www.cnblogs.com/spring3/archive/2012/03/08/2400950.html
總結
以上是生活随笔為你收集整理的throw()使用小结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《海贼王》漫画销量破5亿 刷新吉尼斯世界
- 下一篇: 领克WTCR车队无限期停止参赛!因固特异