學習異常原理,先從幾個例子看起
編譯器什麼時候生成異常支持代碼(棧回退支持)
觀察每個函數生成的彙編代碼 (VS2005, Release模式)
可見函數1 沒有棧回退代碼。
雖然new 函數失敗時可能拋出異常,但編譯器判斷函數有異常時沒有局部類變量需要析構,
所以沒有棧回退代碼生成
可見函數2 加入了棧回退代碼。
因爲new 函數失敗時可能拋出異常,這時需要析構類變量s1,所以加入了棧回退
函數3 和 4 也同樣可以得到上面結論。
當函數拋出一個異常不會生成棧回退,因爲這裏沒有對象需要析構
當函數中有 try 語句時,不管有沒有對象需要析構,都會生成棧回退代碼
總結:
編譯器會檢查函數中是否可能有異常發生,發生異常後是否需要完成棧回退(析構局部類變量),或函數中是否有 try 語句
通過判斷決定是否加入異常處理代碼。