一.C++異常處理機制的組成部分? try(檢查) ,throw(拋出),catch(捕獲)。 將需要檢查的語句放在try塊中,throw用來當出現異常時拋出一個異常信息,而catch則用來捕獲異常信息,如果捕捉到了異常信息,就處理它。
二.try 1.try塊可以嵌套 2.程序按順序尋找匹配的異常處理器,拋出的異常將被第一個類型符合的異常處理器捕獲 3.如果內層try塊后面沒有找到合適的異常處理器,該異常向外傳播,到外層try塊后面的catch塊中尋找 4.沒有被捕獲的異常將調用terminate函數,terminate函數默認調用abort終止程序的執行,可以使用set_terminate函數指定terminate函數將調用的函數
三.throw 1.可以拋出內置類型異常也可以拋出自定義類型異常 2.throw拋出一個類對象會調用拷貝構造函數,因此常拋出臨時對象, e.g. throw Myexception(“Myexception”); 3.拋出異常后,異常發生之前創建的局部對象被銷毀,這一過程稱為棧展開
什么是棧展開? 當一個函數里面拋出異常時,如果拋出的異常沒有在該函數里面找到相應的catch處理模塊,這個時候在拋出異常前的那些局部變量就開始銷毀,最后整個函數調用的棧幀也被銷毀。異常就到了調用該函數的去找catch處理模塊,如果也沒有 那么一樣要銷毀該調用函數的棧幀。就這樣一層層的往外推。這樣的一個過程就是棧展開了
四.catch 1.一個異常處理器一般只捕捉一種類型的異常 2.異常處理器的參數類型和拋出異常的類型相同 3. …表示可以捕獲任何異常
注意: 1.講派生類放在基類catch的上面,否則的話異常信息都會被基類接走 2.接指針的異常 例: throw new MyExceptionD(“MyException”); catch(MyExceptionD *e) { cout << e->what() << endl; delete e; } 我們一般不拋出指針的異常,防止出現淺拷貝。 catch(void *) 接受任何指針的異常,一般放最后。
示例測試代碼附錄: 1.demo1.cpp
#include <iostream>using namespace std;double div(double a, double b){ if(b == 0.0) { //throw(1); throw(5.2); } return a / b;}void myterminate(){ cout << "my terminate" << endl;}int main(){ set_terminate(myterminate); try { div(5.0, 0.0); } catch(int) { cout << "div zero" << endl; } catch(double a) { cout << "a=" << a << endl; cout << "double zero" << endl; } catch(...) { cout << "other zero" << endl; }}2.demo2.cpp
#include <iostream>#include <string>using namespace std;class MyException{public: MyException(char *message) : message_(message) { cout << "constructor MyException" << endl; } MyException(const MyException& other) : message_(other.message_) { cout << "copy constructor MyException" << endl; } ~MyException() { cout << "destroy MyException" << endl; } const char * what() const { return message_.c_str(); }PRivate: string message_;};class MyExceptionD : public MyException{public: MyExceptionD(char *message) : MyException(message) { cout << "constructor MyExceptionD" << endl; } ~MyExceptionD() { cout << "destroy MyExceptionD" << endl; }};class Test{public: Test() { cout << "constructor Test" << endl; } ~Test() { cout << "destroy Test" << endl; }};int main(){ try { // Test t; // MyException e("MyException!"); throw(e); throw MyExceptionD("MyException"); throw new MyExceptionD("MyException"); } catch(void *) { cout << "void *" << endl; } catch(int) { cout << "exception int" << endl; } catch(MyExceptionD& e) { cout << e.what() << endl; } catch(MyException& e) { cout << "Base " << e.what() << endl; } catch(MyExceptionD *e) { cout << e->what() << endl; delete e; } return 0;}新聞熱點
疑難解答
圖片精選