c++異常處理

<1>c++異常匹配規格是根據對象的靜態類型進行匹配的

<2>typedef void (*f)() throw(int) typedef 語句中不能有異常規格說明

<3>throw;向上級拋異常

throw x;拋出異常

1.使用異常說明:

   void foo(void) throw(MyException)/*異常說明,並且foo函數體中只能拋出異常說明中的異常*/{}//只拋出MyException異常

   void foo(void){}//拋出任何異常

   void foo(void)throw(){}//不拋出異常

   另外:如果一個函數拋出了一個在其異常說明中未被列出的異常,那麼std::unexpected()函數就會被調用。

   它的缺省行爲是調用std::terminate()函數,而後者又會調用abort()函數;

2.異常可以嵌套

3.如果函數的聲明有異常說明,那麼定義也需要有異常的說明

4.構造函數可以拋出異常,而且很多場合以這種方式處理構造過程中的錯誤會更簡單。

   但是要注意,拋異常前應該做必要的釋放資源工作,因爲不完全對象的析構函數是不會被調用的。

5.不要在析構函數中拋出異常,因爲拋出異常會導致對象的析構(C語言中如果出錯可能會導致某些資源不能釋        放),這樣可能造成析構和拋出異常之間的死循環。

   如果在析構函數中有異常,應該在內部處理,不要拋出。

6.可以不處理拋出的異常,而交給上一層調用者,即向上一層繼續拋出異常

7.示例:

class AppException {};

class SysException {};

throw AppException ();

throw SysException ();

try {


} catch (AppException& ex) {

   ex.what();

} catch (SysException& ex) {


}

8.注意__LINE__/__FILE__在自定義異常中的應用:

   throw MyExp (__FILE__, __LINE__);

9.不能拋出比基類虛函數更多的異常


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章