亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

C++中的異常處理

2019-11-06 08:54:35
字體:
來源:轉載
供稿:網友

異常處理概念

所有的代碼都有可能不按照預定義的方式運行,成為程序異常。

C++中提供了trycatch語句塊對可能產生異常的代碼進行分開處理:

try語句塊處理正常邏輯catch語句塊處理異常

C++語言中通過throw語句引發一個異常。

應用舉例: 這里寫圖片描述

在上面的例子中,throw扔出的異常值被catch抓到,catch的參數error就是throw扔出的異常值。

throw語句

throw語句用于將異?!皩ο蟆睊伋?。 而且throw拋出的異常必須有catch來進行處理。

throw語句將異常拋出,如果在當前函數中沒有try…catch語句能夠處理該異常,則當前函數將立即返回。

異常被傳遞到上層調用函數,仍然需要try…catch語句 進行處理,如果上層函數也沒有能力處理該異常,則異 常繼續向更上層函數的函數傳遞。

如果在函數調用棧中的所有函數都無法處理拋出的異常,則程序異常中止。

try…catch… 語句

同一個try語句塊可以跟上多個catch語句塊。 同一個try語句塊可以拋出多種不同類型的異常。 不同類型的異常由不同的catch語句塊負責處理。 異常被拋出后會自上而下逐一匹配catch語句塊。

異常匹配時,不會進行默認類型轉換。程序會嚴格匹配每個類型,不會類型轉換。

這些異常是通過異常的數據類型進行區分的。

程序代碼舉例:

#include <cstdlib>#include <iostream>using namespace std;int test(int i){ if( i == 1 ) { throw -1;//拋出 int 型異常 } if( i == 2 ) { throw "ERROR";//拋出 字符串 型異常 } if( i == 3 ) { throw 0.5;//拋出 double 型異常 }// if( i == 4 )// {// throw 'd';//拋出 字符char 型異常,但是沒有相應catch,程序退出 // } return i;}int main(int argc, char *argv[]){ for(int i=0; i<5; i++) { try { cout<<test(i)<<endl; } catch(int e) //處理int型異常 { cout<<"Int: "<<e<<endl; } catch(const char* e)//處理字符串型異常 { cout<<"const char*: "<<e<<endl; } catch(double e)//處理double型異常 { cout<<"double: "<<e<<endl; } //沒有處理字符類型的catch,因此不能拋出字符類型的異常 } cout << "PRess the enter key to continue ..."; cin.get(); return EXIT_SUCCESS;}

異常處理深入

有時在工程中只關心是否產生了異常,而不關心具體的異常類型。

C++中的catch語句可以使用 捕獲所有的異常。

如下圖所示: 這里寫圖片描述

catch(…)可以捕獲所有異常但卻無法得到異常信息。 catch(…)一般作為最后一個異常處理塊出現。在一些現代的編譯器中,如果catch(…)不是最后一個異常處理,程序會報錯。

看見代碼中的catch就要意識到這里在處理異常情況,而且異常是在對應的try中產生的。

在catch語句塊中仍然可以拋出異常,并且需要到外層 程序的catch中進行處理。

在catch(…)語句塊中,可以通過不帶參數的throw語 句拋出已經捕獲到的捕獲的異常。 如下圖所示: 這里寫圖片描述

異常與對象

不要在構造函數中拋出異常。 在構造函數可能申請系統資源,而在構造函數中拋出異常會導致對象構造不完全。 不完全對象的析構函數是不會被調用的,因此可能造成資源泄漏。

如下圖所示: 這里寫圖片描述 在上面的例子中,在為p分配了20字節的空間之后,拋出異常,無法析構,浪費了20字節的空間。

工程中對異常的應用

在工程中會定義一系列的異常類。 通過繼承,可以得到一個異常類族。 每個類代表工程中可能出現的一種異常類型。 為了避免對象構造與拷貝的開銷,在定義catch語句塊時使用引用作為參數。

在工程中可以使用標準庫中的異常類。 可將標準庫中的異常類作為基類派生新的異常類。 標準庫中的異常都是從exception類派生的。

exception類有兩個主要的分支: logic_error用于描述程序中出現的邏輯錯誤。 如:傳遞無效參數、除數為0 runtime_error用于描述無法預料的事件所造成的錯誤。 如:內存耗盡,硬件錯誤

以上兩個分支都是exception類派生的兩個類。 標準庫中的異常類: 這里寫圖片描述 logic_ error和runtime_ error都提供了一個參數為字符串的構造函數,這樣就可以保持錯誤信息。 通過 what() 成員函數就可以得到錯誤的信息。

工程應用舉例:

#include <cstdlib>#include <iostream>#include <stdexcept>//異常類 頭文件 using namespace std;//自定義 divide_by_zero(除數為0)異常類//繼承自 logic_error 異常類, 邏輯錯誤 class divide_by_zero : public logic_error{public: divide_by_zero(const char* s) : logic_error(s) { }//自定義構造函數,參數列表為父類構造函數 };double Div(double a, double b){ if( (-0.00000001 < b) && ( b < 0.00000001) ) { throw divide_by_zero("Divide by zero..."); //拋出異常,異常參數為自定義的異常類 } return a / b;}int main(int argc, char *argv[]){ try { cout<<Div(1, 0)<<endl; } catch(exception& e)//賦值兼容性原則,接收所有的異常類 { cout<<e.what()<<endl;//打印出字符串 } cout << "Press the enter key to continue ..."; cin.get(); return EXIT_SUCCESS;}

函數級try語法

可以將函數體作為一個完整的try語句塊。

如下圖所示: 這里寫圖片描述

函數級try語法可以更好將正常邏輯代碼與異常處理代碼分開,提高代碼的可讀性與維護性。

小結

異常處理是程序中隨處可見的情況。在工程實踐中,大多數的代碼都是用于處理異常的。異常處理的質量直接決定最終產品的質量。

C++提供了 throw語句 和 try…catch語句,用于將正常邏輯代碼與異常處理代碼進行分開處理。

catch(…)可以捕獲所有異常。 catch(…)經常作為最后一個catch語句出現。

不要在構造函數中拋出異常,這樣可能造成資源泄露。

工程中經常以標準庫中的異常類作為項目異常的基礎。

函數級try語句塊能夠更好的提高代碼的維護性。


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

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品自拍视频| 久久久国产精品亚洲一区| 国产精品久久久久7777婷婷| 久久精品久久精品亚洲人| 岛国av在线不卡| 国产精品久久97| 国产精品久久久91| 欧美wwwwww| 亚洲自拍偷拍色图| 欧美电影免费播放| 草民午夜欧美限制a级福利片| 午夜精品久久17c| 亚洲激情第一页| 日韩av综合网| 一本一本久久a久久精品牛牛影视| 亚洲色图激情小说| 国产丝袜高跟一区| 青草青草久热精品视频在线观看| 欧美理论电影网| 日韩av在线影视| 97精品欧美一区二区三区| 亚洲精品短视频| 97在线视频免费播放| 日本成人精品在线| 欧洲精品久久久| 最近2019年中文视频免费在线观看| 亚洲欧美一区二区三区在线| 国产情人节一区| 亚洲国产成人精品久久| 亚洲一级黄色片| 亚洲精品动漫久久久久| 精品欧美aⅴ在线网站| 久久中文字幕国产| www.亚洲免费视频| 日韩欧美在线视频日韩欧美在线视频| 国产丝袜精品第一页| 亚洲第一网站男人都懂| 81精品国产乱码久久久久久| 2020久久国产精品| 国产精品成人在线| 国产精品美女主播| 国产精品视频久| 国产精品高潮在线| 国产精品电影观看| 日韩在线www| 9.1国产丝袜在线观看| 丝袜美腿亚洲一区二区| 91在线观看免费观看| 欧美老女人性视频| 2019中文字幕全在线观看| 久久激情视频免费观看| 中文字幕亚洲欧美| 国产欧美日韩中文字幕在线| 欧美精品做受xxx性少妇| 欧美在线视频免费| 琪琪亚洲精品午夜在线| 欧美在线视频观看| 91在线精品视频| 国产亚洲视频在线观看| 久热精品在线视频| 国产在线精品成人一区二区三区| 一级做a爰片久久毛片美女图片| 国产精品一区二区三区毛片淫片| 精品国产一区二区三区久久久狼| 91视频免费在线| 国产一区二区视频在线观看| 日韩风俗一区 二区| 欧美成人剧情片在线观看| 日韩欧美在线观看视频| 久久福利视频导航| 欧美性20hd另类| 视频在线观看一区二区| 久久成人精品电影| 91黑丝高跟在线| 国产视频在线观看一区二区| 91sa在线看| 久久男人av资源网站| 日韩女在线观看| 日韩色av导航| 日韩亚洲欧美成人| 欧美壮男野外gaytube| 久久久久久亚洲精品不卡| 亚洲老板91色精品久久| 97在线免费观看视频| 亚洲а∨天堂久久精品喷水| 亚洲影视九九影院在线观看| 欧美在线日韩在线| 国产精品入口免费视频一| 91精品国产91久久久久久不卡| 国产偷亚洲偷欧美偷精品| 久久视频国产精品免费视频在线| 日韩av在线天堂网| 一个色综合导航| 国模精品视频一区二区三区| 影音先锋日韩有码| 97在线免费观看视频| 欧美精品亚州精品| 性欧美xxxx视频在线观看| 亚洲国产另类久久精品| 国产成人一区二区三区| 国产一区香蕉久久| 欧美激情精品久久久久久大尺度| 精品动漫一区二区| 国产精品高精视频免费| 91av福利视频| 538国产精品一区二区免费视频| 成人美女av在线直播| 欧美视频在线视频| 国产午夜精品一区理论片飘花| 亚洲色图色老头| 国产视频久久网| 亚洲精品自产拍| 亚洲国产美女久久久久| 欧美精品videosex牲欧美| 正在播放亚洲1区| 这里只有精品丝袜| 久久亚洲成人精品| 国产成人一区二区三区电影| 国产有码在线一区二区视频| 91中文在线视频| 欧美激情一区二区三区在线视频观看| 欧美日韩精品二区| 日韩视频在线免费观看| www.日韩免费| 91精品久久久久久久久久| 精品视频在线播放| 国产精品美乳一区二区免费| 国产丝袜一区视频在线观看| 国产精品网站入口| 欧美亚洲成人精品| 这里只有精品视频| 日韩欧美亚洲范冰冰与中字| 日韩欧美一区二区三区| 久久视频这里只有精品| 国产精品久久久久久久av电影| 18一19gay欧美视频网站| 国产精品高潮在线| 国产一区二区欧美日韩| 国产精品美女主播在线观看纯欲| 日韩免费看的电影电视剧大全| 九九精品视频在线观看| 日韩一区二区精品视频| 精品国产一区久久久| 另类美女黄大片| 91精品国产综合久久香蕉922| 久久成人国产精品| 日韩有码在线播放| 福利一区福利二区微拍刺激| 国产精品久久99久久| 欧美日韩国产一区二区| 欧美成人全部免费| 两个人的视频www国产精品| 红桃视频成人在线观看| 国产精品尤物福利片在线观看| 久久全国免费视频| 国产精品高潮呻吟久久av黑人| 日韩国产一区三区| 久久人人爽人人爽人人片亚洲| 国产亚洲精品va在线观看| 一区二区亚洲欧洲国产日韩| 国产又爽又黄的激情精品视频| 少妇激情综合网| 欧美日韩亚洲国产一区| 欧美丰满少妇xxxx|