国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++異常處理機制

2019-11-06 06:41:43
字體:
來源:轉載
供稿:網友

一.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;}
上一篇:C++四種類型轉換

下一篇:c++作業2

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 雷波县| 连城县| 曲阳县| 南丰县| 衡南县| 渭源县| 文山县| 安泽县| 射洪县| 嘉禾县| 凤城市| 天长市| 营口市| 兴山县| 吉林省| 陆河县| 苗栗市| 红安县| 凌源市| 通许县| 太保市| 花莲县| 鄂伦春自治旗| 武乡县| 寿宁县| 额济纳旗| 茌平县| 西峡县| 胶南市| 夏津县| 莱西市| 上思县| 烟台市| 吉木萨尔县| 宝丰县| 金乡县| 库尔勒市| 玉山县| 高密市| 五原县| 象州县|