基本知識
下圖表示了標准異常的繼承關系
exception是所有標准異常的基類,自定義異常也需要繼承exception,如下例:
1 #include "pch.h" 2 #include <iostream> 3 4 using namespace std; 5 6 struct MyException:public exception { 7 const char* what()const throw(){ 8 return "這是我自定義的異常類!"; 9 } 10 }; 11 12 int main(){ 13 try { 14 throw MyException(); 15 } 16 //catch (...) { 17 // cout << "捕獲所有異常" << endl; 18 //} 19 catch (MyException& ex) { 20 cout << "捕獲自定義異常 MyException :" << ex.what() << endl; 21 } 22 }
注意:第7行中的 const throw() 是異常規格說明,這里表示這個函數內部不會拋出異常。如果改成 const throw(A) 則表示這個函數可能會拋出A類異常。
注意:第16-18的注釋行,這個捕獲塊會捕獲所有異常,其后面的異常會被屏蔽,所以不能在它后面再添加新的塊,可以在前面添加,相當於switch語句的default。
關於構造函數異常(參考文章)
在構造函數中發生異常會導致對象無法被創建,經典解決方案是使用使用STL的標准類auto_ptr,或者在構造函數中給成員賦值為null,然后構造函數調用init函數來進行一些容易出錯的操作,如果拋出異常則在構造函數中捕獲並調用uinit來釋放已經分配的內存。