深入了解C++異常處理_第1頁
深入了解C++異常處理_第2頁
深入了解C++異常處理_第3頁
深入了解C++異常處理_第4頁
深入了解C++異常處理_第5頁
已閱讀5頁,還剩2頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第深入了解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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論