麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

【c++】異常

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

程序有時會遇到運行階段的錯誤,比如打開一個不存在的文件,請求過多內存,接受一個不能使用值……通常程序員會避免這樣的的以外,而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";}

.


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 久久精品欧美一区二区 | 日韩一级片黄色 | 欧美wwwsss9999| 北京一级毛片 | 国产一区二区三区黄 | 欧产日产国产精品v | 欧美18xxxx| 老司机一级毛片 | 中文在线日韩 | 欧美四级在线观看 | 免费a视频在线观看 | 久久日韩在线 | 最新av在线播放 | 免费毛片视频 | xxx日本视频 | 免费观看视频网站 | 91精品观看91久久久久久国产 | 久久成人精品视频 | 亚洲第一综合 | 香蕉视频18| 男女羞羞视频 | 欧洲成人综合网 | 永久免费av在线 | 国产一级大片 | 欧美 亚洲 激情 | 欧美视频在线一区二区三区 | 最新中文在线视频 | 日韩a毛片免费观看 | 12av毛片| 深夜小视频在线观看 | 国产精品视频一区二区三区四区五区 | 欧美日韩免费看 | 欧美成人免费电影 | 久久免费视频3 | 久久国产精品久久久久久久久久 | 日本一道aⅴ不卡免费播放 视屏一区 | 精品国产一区二区三区四区在线 | 中文字幕在线观看免费视频 | 国产精品视频成人 | 欧美一级毛片欧美一级成人毛片 | 国产精品久久久久久模特 |