国产探花免费观看_亚洲丰满少妇自慰呻吟_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

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

圖片精選

主站蜘蛛池模板: 桓仁| 长沙市| 白玉县| 镇宁| 平凉市| 青河县| 印江| 巴塘县| 长沙市| 商南县| 靖宇县| 桑日县| 陵水| 公主岭市| 九寨沟县| 新化县| 苗栗市| 基隆市| 石景山区| 凉城县| 金沙县| 安乡县| 集贤县| 瓮安县| 鹤山市| 邯郸县| 固始县| 黔南| 永和县| 麟游县| 喀喇沁旗| 潢川县| 余江县| 上蔡县| 上栗县| 台州市| 花莲县| 社旗县| 凤翔县| 乐清市| 开封县|