<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.不能拋出比基類虛函數更多的異常