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

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

【c++】異常

2019-11-14 10:52:29
字體:
來源:轉載
供稿:網友

程序有時會遇到運行階段的錯誤,比如打開一個不存在的文件,請求過多內存,接受一個不能使用值……通常程序員會避免這樣的的以外,而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
国产精品久久久久一区二区| 亚州精品天堂中文字幕| 欧美一级电影在线| 92看片淫黄大片欧美看国产片| 色综合影院在线| 91精品国产一区| 91精品美女在线| 亚洲天堂成人在线| 国产精品成熟老女人| 北条麻妃一区二区在线观看| 91视频免费在线| 国产91久久婷婷一区二区| 日韩在线免费av| 97精品一区二区视频在线观看| 美女av一区二区三区| 亚洲精品国产品国语在线| 欧美极品少妇xxxxⅹ裸体艺术| 欧美一区二区三区……| 亚洲人在线观看| 国产剧情日韩欧美| 亚洲欧洲av一区二区| 亚洲日本成人网| 日韩av手机在线看| 欧美午夜激情视频| 少妇高潮 亚洲精品| 久久露脸国产精品| 中文字幕亚洲一区在线观看| 性色av一区二区三区红粉影视| 欧美最猛性xxxxx(亚洲精品)| 精品福利视频导航| 欧美成人一区二区三区电影| 国产+人+亚洲| 亚洲精品久久7777777| 欧美高清videos高潮hd| 亚洲国产精品成人一区二区| 欧美电影免费观看网站| 国产精品久久久久av免费| 亚洲激情自拍图| 日韩国产欧美精品在线| 国产欧美精品在线播放| 久久免费视频这里只有精品| 亚洲一区二区三区视频| 91av在线网站| www.欧美三级电影.com| 亚洲人成免费电影| 国产精品美女无圣光视频| 97人人模人人爽人人喊中文字| 欧美激情影音先锋| 欧美日韩国产成人在线观看| 亚洲国产天堂久久综合网| 久久夜精品香蕉| 国产欧美日韩综合精品| 亚洲天堂免费在线| 欧美激情一级精品国产| 欧美精品免费播放| 最近日韩中文字幕中文| 亚洲国产小视频| 亚洲男女自偷自拍图片另类| 韩国三级日本三级少妇99| 欧美性猛交xxxx富婆| 91美女片黄在线观看游戏| 欧美在线免费视频| 欧美日韩另类字幕中文| 亚洲欧美日韩精品久久| 午夜精品久久久久久99热| 91在线观看免费高清完整版在线观看| 91爱爱小视频k| 日韩美女写真福利在线观看| 国产精品免费看久久久香蕉| www.xxxx精品| 日产日韩在线亚洲欧美| 岛国av一区二区在线在线观看| 欧美噜噜久久久xxx| 精品久久久久久久久久久久| 欧美国产日产韩国视频| 亚洲新声在线观看| 久久成人综合视频| 国产美女精品免费电影| 欧美性极品xxxx娇小| 中文字幕在线国产精品| 韩国三级日本三级少妇99| 中文日韩在线视频| 亚洲三级免费看| 欧美国产亚洲精品久久久8v| 久久久久久网站| 成年无码av片在线| 精品少妇一区二区30p| 欧美洲成人男女午夜视频| 国产91精品久久久久久| 热久久美女精品天天吊色| www.精品av.com| 国产高清视频一区三区| 欧美剧在线观看| 亚洲国产97在线精品一区| 国产精品久久电影观看| 日韩视频一区在线| 中文字幕最新精品| 国产精品一区二区久久精品| 成人黄色在线观看| 国产精品一区二区3区| 久久久极品av| 少妇高潮 亚洲精品| 亚洲一区二区三区四区视频| 精品国产一区二区三区久久久| 亚洲国产日韩欧美在线99| 亚洲男人天堂九九视频| 亚洲欧洲日产国码av系列天堂| 欧美一级片免费在线| 亚洲一区二区三区香蕉| 91国产精品电影| 久久精品久久久久久国产 免费| 久久精品中文字幕电影| 色多多国产成人永久免费网站| 久久99亚洲热视| 欧美一区二区三区免费观看| 亚洲一区二区日本| 久久久久久97| 国产精品高潮呻吟久久av黑人| 欧美色视频日本高清在线观看| 亚洲精品一区二区三区不| 欧美日韩一区二区精品| 久久久久久久爱| 亚洲精品乱码久久久久久金桔影视| 国产精品成人一区二区| 欧美电影电视剧在线观看| 国产mv免费观看入口亚洲| 色av吧综合网| 国产成人高清激情视频在线观看| 国产91精品视频在线观看| 国产视频精品xxxx| 久久777国产线看观看精品| 欧美激情在线视频二区| 欧美精品做受xxx性少妇| 国内揄拍国内精品| 亚洲性视频网站| 亚洲精品一区中文| 久久在线精品视频| 久久精品国产久精国产思思| 日本三级韩国三级久久| 中文字幕少妇一区二区三区| 日韩在线观看精品| 欧美午夜片在线免费观看| 91po在线观看91精品国产性色| 亚洲欧洲高清在线| 欧美乱妇40p| 国产国语videosex另类| 最近2019免费中文字幕视频三| 美日韩精品免费视频| 亚洲一区国产精品| 欧美在线观看一区二区三区| 精品成人国产在线观看男人呻吟| 成人黄色av免费在线观看| 国产精品久久精品| xvideos国产精品| 国产做受高潮69| 高清亚洲成在人网站天堂| 91精品成人久久| 菠萝蜜影院一区二区免费| 成人福利网站在线观看| 国内成人精品一区| 88xx成人精品| 亚洲人午夜色婷婷| 狠狠躁夜夜躁久久躁别揉| 国产91精品久久久久|