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

首頁 > 學院 > 開發設計 > 正文

【c++】異常

2019-11-14 11:23:18
字體:
來源:轉載
供稿:網友

程序有時會遇到運行階段的錯誤,比如打開一個不存在的文件,請求過多內存,接受一個不能使用值……通常程序員會避免這樣的的以外,而c++提供了一種功能清大的而靈活的工具——異常。

例如下面這個示例

int main(int argc, char** argv) { int x=19; int y=-x; cout<<(2*x*y/(x+y)); return 0;}

上面是輸出兩個數的調和平均數(兩個數的倒數的平均數的倒數)

對于上面程序而言編譯器可能輸出一個表示無窮大的浮點數值,cout將這個值輸出為Inf,inf,INF(Infinitely),也可能直接崩潰(dev c++5.11)。

解決方法 1

#include <iostream>#include<cstdlib>//for abort()using std::cout;using std::cin;using std::endl;double harmonic(double a,double b);int main(int argc, char** argv) { int x=0; int y=0; cout<<"enter two number"; while(cin>>x>>y) { int z=harmonic(x,y); cout<<"harmonic mean of "<<x <<" and "<<y<<" is "<<z<<endl; cout<<"enter next set of number<q to quit>:"; } cout<<"Bye!/n"; return 0;}double harmonic(double a,double b){ if(a==-b){ cout<<"untenable argument to harmonic/n"; std::abort(); } return 2.0*a*b/(a+b);}

abort 是位于頭文件cstdlib 中,其典型實現是向標準錯誤流發送 abnormal PRogram termination(程序終止)然后終止程序,還返回一個隨實現而異的值,告訴父進程處理失敗。abort刷不刷新文件緩沖區(用于存儲讀寫到文件中的數據的內存區域)取決于實現。也可以用exit()它會刷新緩沖文件緩沖區,但不顯示消息

解決方法 2: 一種比異常終止更靈活的方法是,使用函數返回值來指出問題。例如ostream類的get(void)函數通常返回下一個輸入的字符的ASCII嗎。但都到文件尾部時返回特殊的EOF(一般為signed char)。對haemonic()來說這種方式不管用,因為任何數值都是有效的返回值(答案)這時候我們就可以使用指針或者引用充當返回值。并使用函數返回值來指定返回的的成功和失敗

#include <iostream>#include<cfloat>//for DBL_MAXusing std::cout;using std::cin;using std::endl;bool harmonic(double ,double ,double* );int main(int argc, char** argv) { double x,y,z; cout<<"enter two number"; while(cin>>x>>y) { if(harmonic(x,y,&z)) cout<<"harmonic mean of "<<x <<" and "<<y<<" is "<<z<<endl; else cout<<"one value should not be the negative" <<"of the ohter ,try again/n"; cout<<"enter next set of number<q to quit>:"; } cout<<"Bye!/n"; return 0;}bool harmonic(double a,double b,double* ans){ if(a==-b){ *ans=DBL_MAX; return false; } else{ * ans=2.0*a*b/(a+b); return true; }}

解決方法 3

#include <iostream>#include<cfloat>//for DBL_MAXusing std::cout;using std::cin;using std::endl;double harmonic(double ,double );int main(int argc, char** argv) { double x,y,z; cout<<"enter two number"; while(cin>>x>>y) { try{ z=harmonic(x,y); }catch(const char * s){ cout<<s<<endl; cout<<"Enter a new pair of number"; continue; } cout<<"harmonic mean of "<<x <<" and "<<y<<" is "<<z<<endl; cout<<"enter next set of number<q to quit>:"; } cout<<"Bye!/n"; return 0;}double harmonic(double a,double b){ if(a==-b){ throw "bad harmonic() arguments :a =-b not allowed"; } return 2.0*a*b/(a+b);}

異常的格式如下

try{ //拋出異常的語句}catch(exceptionType exceptionParameter){ //異常怎么處理寫在這}

就像上面的示例那樣throw在try中拋出了一個錯誤,錯誤類型是一串字符。try接受到錯誤,然后程序跳轉到catch語句塊。其中exceptionType 為我們throw拋出的參數類型。exceptionParameter是參數的名稱,我們可以在catch語句塊中使用這個參數。

將對象用作異常類型

#include <iostream>#include<cmath>//for sqrt()using std::cout;using std::cin;using std::endl;class bad_hmean{ private: double v1; double v2; public : bad_hmean(double a=0,double b=0):v1(a),v2(b){}; void mesg();};inline void bad_hmean::mesg(){ cout<<"hmean("<<v1<<","<<v2<<")" <<"incalid argument: a=-b"<<endl;}class bad_gmean{ public: double v1; double v2; bad_gmean(double a=0,double b=0):v1(a),v2(b){} const char* mesg();};inline const char* bad_gmean::mesg(){ return "gmean() arguments should be>=0/n";}double hmean(double a,double b);double gmean(double a,double b);int main(int argc, char** argv) { double x,y,z; cout<<"enter two number"; while(cin>>x>>y) { try{ z=hmean(x,y); cout<<"Harmonic mean of "<<x<<"and"<<y <<"is"<<z<<endl; cout<<"Geometric mean of "<<x<<"and"<<y <<"is"<<gmean(x,y)<<endl; }catch(bad_hmean & bg){ bg.mesg(); cout<<"try again"; continue; }catch(bad_gmean& hg){ cout<<hg.mesg(); cout<<"Value used:"<<hg.v1<<","<<hg.v2<<endl; cout<<"Sorry ,you don't get to play any more./n"; break; } cout<<"Bye!/n"; return 0; }}double hmean(double a,double b){ if(a==-b){ throw bad_hmean(a,b); } return 2.0*a*b/(a+b);}double gmean(double a,double b){ if(a<0||b<0){ throw bad_gmean(a,b)塊塊塊塊 } return std::sqrt(a*b);}

上面代碼使用了對象作為throw 的返回類型,且使用多個catch語句塊

異常規范和c++11

異常規范是告訴編譯器一個函數師是否可能會產生異常,格式如下

int fun1()thow(bad_thing);//可能產生異常int fun2()thow();//不會產生異常

上述格式可以出現在函數聲明定義上,這是c++98引入的概念,但是c++11已經摒棄這種做法了。因為其一因為會出現函數之間的調用回家打編譯器的檢查難度。其次如果我們更新了代碼庫,而以前的代碼如果不修改可能會無法使用。 所以建議不要使用上述異常規范 c++11引用了noexcept來指出函數不產生異常 int main() noexcept 告訴編譯器這個函數不會出現異常

還有運算符 noexcept(OperandName ) 用來判斷操作數是否會引發異常

異常的重要特性

引發異常時編譯器總會創建一個臨時拷貝,即使異常規范和catch中指定時引用,我們會這樣呢。請款下面例子:

class problem{};……void super()(proble){…… if(oh_no) { prolem oops; throw oops; }……}……try{ super();}catch(problem & p){//……}

上面的oops在函數執行完就沒了,所以必須拷貝一個臨時變量。 既然會創建臨時變量為什么要用引用呢。畢竟引用作為返回值就是節省創建副本的開銷啊。這是因為因為基類的引用可以使用派生類的方法。當有一系列的異常層次結構時。這是后基類的異常類型引用將匹配所有派生類的異常。這就需要注意一點就是catch的順序了

class bad_1{};class bad_2:public bad_1{};class bad_3:public bad_2{};……try{}catch(bad_3){}catch(bad_2){}catch(bad_1){}

上面的catch語句開順序是呵護清理的,因為bad_1是基類如果放在第一個catch中的話,拋出的所有異常都會有bad_1語句塊處理,根本沒有后面的catch{}什么事。

當我們調用一個函數時,我們可能不知道這個函數會拋出什么異常。但是我們也可以捕獲異常。就是使用…

try{ fun()}catch(...){ cout<<"have exception";}

.


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产99视频精品免视看7| 7777精品久久久久久| 色青青草原桃花久久综合| 91精品国产综合久久香蕉922| 51久久精品夜色国产麻豆| 欧美成人午夜激情视频| 91中文字幕在线观看| 中文字幕精品国产| 国产精品一区二区三区在线播放| 一区二区在线免费视频| 国产丝袜高跟一区| 日韩中文字幕在线观看| 国产成人av在线| 日韩免费av片在线观看| 欧美色图在线视频| 欧美xxxx18性欧美| 欧美人与物videos| 疯狂做受xxxx欧美肥白少妇| 国产丝袜视频一区| 亚洲美女精品久久| 精品国产欧美一区二区五十路| 欧美日韩在线视频观看| 欧美日韩亚洲精品一区二区三区| 成人午夜一级二级三级| 91天堂在线视频| 欧美最猛性xxxx| 欧美精品电影在线| 91精品视频在线| 国产精品欧美日韩| 美女av一区二区| 亚洲欧美国产精品久久久久久久| 国产精品9999| 国产精品va在线播放我和闺蜜| 欧美裸体xxxx极品少妇软件| 91精品国产自产在线观看永久| 欧美国产视频日韩| 97碰碰碰免费色视频| 亚洲韩国日本中文字幕| 国产精品成久久久久三级| 欧美日韩另类字幕中文| 亚洲国产欧美一区二区三区同亚洲| 国产精品久久久久久久久久ktv| 亚洲国产精品yw在线观看| 97久久国产精品| 久久的精品视频| 久久精品视频va| 亚洲高清免费观看高清完整版| 91精品国产高清久久久久久91| 亚洲欧美在线磁力| 欧美丝袜美女中出在线| 亚洲国产日韩欧美在线动漫| 92看片淫黄大片欧美看国产片| 日韩av在线一区二区| 综合久久五月天| 欧美片一区二区三区| 欧美一级高清免费播放| 国产精品自拍小视频| 欧美猛交免费看| 深夜福利亚洲导航| 国产精品电影观看| 韩国三级电影久久久久久| 韩国视频理论视频久久| 日本欧美中文字幕| 国产丝袜一区二区| 尤物99国产成人精品视频| 亚洲无av在线中文字幕| 亚洲最大激情中文字幕| 欧美日韩国产在线看| 在线观看欧美www| 久久综合久久八八| 国产z一区二区三区| 欧美在线视频导航| 色哟哟亚洲精品一区二区| xxxx性欧美| 亚洲欧美日韩精品久久亚洲区| 91国内在线视频| 欧美在线视频一区二区| 国产日韩视频在线观看| 日韩在线视频播放| 日韩大片免费观看视频播放| 91免费看片在线| 97在线视频免费看| 亚洲欧美国产精品| 国产精品亚洲一区二区三区| 久久精品国亚洲| 亚洲久久久久久久久久久| 这里只有视频精品| 国产91精品久| 精品无人区太爽高潮在线播放| 国产99久久精品一区二区永久免费| 欧美国产中文字幕| 日韩精品在线免费观看视频| 中文字幕国产亚洲| 久久影院在线观看| 国产精品久久久久久久久男| 亚洲成人久久电影| 中文字幕日韩精品有码视频| 国产这里只有精品| 久久久欧美精品| 亚洲综合一区二区不卡| 欧美精品做受xxx性少妇| 91精品国产高清自在线看超| 久热99视频在线观看| 国产精品视频自在线| 91精品久久久久久久久中文字幕| 欧美午夜无遮挡| 一区二区三区无码高清视频| 91免费国产视频| 8090理伦午夜在线电影| 欧美中文在线视频| 亚洲社区在线观看| 久久99精品久久久久久琪琪| 亚洲va国产va天堂va久久| 在线观看亚洲视频| 国产精品pans私拍| 亚洲天堂av图片| 亚洲国产精品热久久| 久久影视电视剧免费网站| 麻豆国产va免费精品高清在线| 日韩精品高清在线| 欧美夜福利tv在线| 日本不卡视频在线播放| 国产精品日韩久久久久| 777国产偷窥盗摄精品视频| 欧美激情网友自拍| 91精品成人久久| 亚洲电影免费观看| 91夜夜未满十八勿入爽爽影院| 色偷偷av亚洲男人的天堂| 国产一区二区三区高清在线观看| 91sao在线观看国产| 日韩精品视频在线免费观看| 国产精品海角社区在线观看| 久久视频免费在线播放| 欧美黄色三级网站| 18一19gay欧美视频网站| 午夜精品久久久久久99热软件| 精品国产区一区二区三区在线观看| 久久久这里只有精品视频| 欧美激情视频一区二区三区不卡| 日韩在线免费高清视频| 欧美激情亚洲视频| 国产成人a亚洲精品| 国产精品久久久999| 国产噜噜噜噜久久久久久久久| 国内精品久久久久久久久| 一本一本久久a久久精品综合小说| 日韩精品欧美国产精品忘忧草| 成人综合网网址| 欧美裸身视频免费观看| 97国产精品人人爽人人做| 91精品久久久久久| 丝袜情趣国产精品| 操91在线视频| 欧美国产日韩二区| 在线中文字幕日韩| 亚洲综合自拍一区| 欧美一性一乱一交一视频| 日韩av在线影视| 日韩欧美有码在线| 亚洲综合日韩在线| 日韩动漫免费观看电视剧高清| 日韩小视频在线观看| 欧美极品美女视频网站在线观看免费|