




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第深入了解C++異常處理//某個函數不存在異常,在某個函數后面用throw()描述,表示它不存在異常
voidprint()throw()
cout"當前函數不存在拋出異常操作"endl;
voidprintData()noexcept
cout"c++新標準中的關鍵字:不存在拋出異常操作"endl;
//throw0;一旦說明沒有異常操作,就不能拋出
}
刪減符...
任何類型的異常都捕獲
不管拋出啥,在哪里拋出的,只要引發異常都可以捕獲到
catch(...)
cout"捕獲任何類型的異常"endl;
}
異常處理中的傳參操作
---可以寫一個變量進去
catch(inta)/*隱藏了一個傳參操作可以傳任何類型,包括自定義類型都可以*/
注意c++中string的處理
/*string類型與constchar*類型區別*/
代碼解析:
對
通過拋出字符串,隱藏了一個傳參操作
的理解
intdivisor(inta,intb)
if(b==0)
throwstring("除數不能為0");
returna/b;
intmain()
divisor(1,0);
catch(stringstr)//把throw的內容賦值給strstr="除數不能為0"
coutstrendl;
}
注意string類型與constchar*類型區別
---出現類型不匹配,c++對傳參類型要求更嚴格
intdivisor(inta,intb)
if(b==0)
throw"除數不能為0";//拋出異常解析為char*類型寫catch時不能直接當作string
if(b==1)
throw"除數不能為1";/*不同問題的拋出,不能用固定類型(int、char...),可以選擇
拋出不同字符串處理string1,string2,string3...通過傳
參的方式去描述問題*/
if(b==2)
throwstring("除數不能為2");//需構造無名參數作捕獲對象處理---需要自己觸發
returna/b;
intmain()
divisor(1,0);//直接觸發異常
catch(constchar*str)//拋出的是char*類型,不能當作string
coutstrendl;
divisor(1,2);
catch(stringstr)//如果要捕獲string類型,需要自己構造一個string對象返回
coutstrendl;//直接輸出str
}
可以拋出自己類的對象
classError
public:
Error(constchar*str="未知錯誤"):str(str){}
constchar*what()const
returnstr.c_str();
protected:
stringstr;
voidinsertArray(intarray[],int*curNum,intposData,intmaxLength)
if(*curNum=maxLength)//3=3
throwError("數組下標溢出!");
//012
array[*curNum]=posData;//array[3]=3
(*curNum)++;
intmain(){
intarray[3]={0,0,0};
intcurNum=0;
for(inti=0;ii++)
insertArray(array,curNum,i,3);
catch(Errorstr)
coutstr.what()endl;
return0;
}
標準庫當中的異常類
#includeexception//父類(基類)
子類很多,子類描述的問題不同而已
例子:constchar*_ptr;一個數據成員,用于描述標準庫當中異常的字符串,用字符指針存放那個字符串
what()方法
用于返回數據成員的
1.虛函數
2.不存在異常
return_ptr_ptr:"unknow";判斷char*類型的指針是不是為空,不等于空,返回你描述的錯誤,等于空(由于沒有傳參),返回未知錯誤"unknow"
引發標準庫中內存申請失敗的異常
發現代碼出現abort()錯誤,可以通過這種方式找到,這里是針對內存申請失敗做了單一處理,如果不做處理,會直接調用abort函數終止程序
#includeexception
#includeiostream
usingnamespacestd;
classException
public:
Exception(constchar*ptr="UNKNOW"):ptr(const_castchar*(ptr)){}/*構造函數干掉
常屬性*/
virtualconstchar*what()const//父類是虛函數且不存在異常
returnptr;
protected:
char*ptr;
//子類繼承父類
classBad_alloc:publicException
public:
Bad_alloc(constchar*_Message="badexception"):Exception(_Message){}/*調用父類
的構造函數拋出badexception*/
protected:
//子類繼承父類調用父類構造函數
classRun_time:publicException
public:
Run_time(constchar*_Message="run_timeerror"):Exception(_Message){}
protected:
intmain()
try
while(1)
int*p=newint[1024*1024*10];//一直做內存申請,不做釋放,最后一定會內存申請失敗
catch(bad_allocobject)/*內存申請失敗,調用bad_alloc標準庫中的異常,創建一個對象接收一
下,子類中的what()方法調用父類中的what()方法打印*/
coutobject.what()endl;
return0;
/*輸出*/
badallocation//調用時拋出badallocation是子類對象調用繼承下來的what()方法
//一般寫代碼出現莫名的中斷,原因是不做異常處理,引發了abort函數中斷程序,一般這種錯誤都是特殊錯誤
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 考點高頻2025年執業醫師考試試題及答案
- 執業護士考試的最佳復習策略及試題答案
- 2025年執業護士應對策略試題及答案
- 常見藥物相互作用的試題及答案詳盡探討
- 主管護師考試知識要點與試題及答案
- 2025年護士行業前景試題及答案
- 生理心理學在護理中的應用試題及答案
- 2025年大學語文考前預測試題及答案
- 考試大綱2025年試題及答案
- 備戰醫師考試的全新方案試題及答案
- 2025年郵政社招筆試試題及答案
- 2025年保密觀知識測試題及答案
- 臨床試驗倫理委員會遠程會議審查的標準操作規程
- DB31T 1187-2019 特種設備風險分級管控實施指南
- 三年級數學下冊《面積》練習試卷及答案
- 室內裝飾醫療貝斯板技術交底
- 會計師事務所自查自糾報告范文3篇
- 信用評級ppt全套教學課件
- 2022年煙臺毓璜頂醫院醫護人員招聘考試筆試題庫及答案解析
- 現場跟蹤審計工作要點
- 公制螺紋公差速查表
評論
0/150
提交評論