




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
程序調(diào)試與異常處理
程序調(diào)試與異常處理語(yǔ)法錯(cuò)誤的調(diào)試與BUG的調(diào)試異常處理塊使用IDE對(duì)各種錯(cuò)誤進(jìn)行調(diào)試掌握C++異常處理機(jī)制,熟練編寫異常處理塊并進(jìn)行處理1程序分為Debug版本和Release版本。Release稱為發(fā)布版本,它往往是進(jìn)行了各種優(yōu)化,使得程序在代碼大小和運(yùn)行速度上都是最優(yōu)的,以便用戶很好地使用。Debug通常稱為調(diào)試版本,它包含調(diào)試信息,并且不作任何優(yōu)化,便于程序員調(diào)試程序。2.6程序調(diào)試與異常處理2.6.1:程序調(diào)試2C++的錯(cuò)誤大致可以分為兩類,一類是編譯器和連接器可以發(fā)現(xiàn)的語(yǔ)法錯(cuò)誤。另一類是在沒有語(yǔ)法錯(cuò)誤的情況下,也可能會(huì)發(fā)生讓程序無(wú)法正確運(yùn)行的邏輯錯(cuò)誤,習(xí)慣上將這種錯(cuò)誤叫做BUG。代碼編寫完成后,源代碼要被轉(zhuǎn)換為計(jì)算機(jī)可以識(shí)別的指令,每個(gè)源文件都要被編譯為中間文件,然后,所有的中間文件被鏈接成為.exe文件。2.6程序調(diào)試與異常處理2.6.1:程序調(diào)試3【生成】菜單中提供了生成解決方案相關(guān)的命令?!旧山鉀Q方案】命令讓VisualStudio2005編譯各個(gè)源文件,并將它們鏈接成為.exe文件或其他形式的程序文件?!局匦律山鉀Q方案】這個(gè)命令讓編譯器重新編譯所有源文件,即使這些文件沒有被修改過(guò)?!厩謇斫鉀Q方案】命令用于清除解決方案在以前生成可執(zhí)行文件時(shí)產(chǎn)生的舊文件。第一次生成解決方案時(shí),源文件都會(huì)被編譯一次,此后再生成解決方案時(shí),如果某個(gè)源文件沒被修改過(guò),這個(gè)源文件將不會(huì)被重新編譯。2.6程序調(diào)試與異常處理2.6.1:程序調(diào)試4生成一個(gè)解決方案后,會(huì)在【輸出窗口】中顯示日志,編譯中發(fā)現(xiàn)的錯(cuò)誤將會(huì)被列出。雙擊包含“error”的行,可以迅速切換到出錯(cuò)的代碼。編譯文件時(shí),還可能出現(xiàn)另一種信息,即警告信息,這些警告提示了程序中潛在的錯(cuò)誤。2.6程序調(diào)試與異常處理2.6.1:程序調(diào)試5VisualStudio2005有如下兩個(gè)基本調(diào)試功能:找出BUG發(fā)生的地方。分析如何修改BUG。調(diào)試工具允許每次只執(zhí)行一行程序代碼,這樣可以更方便地找到BUG發(fā)生的地方。調(diào)試工具具有以下3個(gè)基本功能:1)設(shè)置斷點(diǎn),跟蹤程序段的執(zhí)行。2)進(jìn)入函數(shù)調(diào)用或跳過(guò)函數(shù)調(diào)用。3)設(shè)置監(jiān)視窗口觀察變量和表達(dá)式。2.6程序調(diào)試與異常處理2.6.1:程序調(diào)試6斷點(diǎn)是調(diào)試器設(shè)置的一個(gè)代碼位置。當(dāng)程序運(yùn)行到斷點(diǎn)時(shí),程序中斷執(zhí)行,回到調(diào)試器。斷點(diǎn)是最常用的技巧。調(diào)試時(shí),只有設(shè)置了斷點(diǎn)并使程序回到調(diào)試器,才能對(duì)程序進(jìn)行在線調(diào)試??梢栽谛枰O(shè)置斷點(diǎn)的程序行上用鼠標(biāo)左鍵單擊添加或移除斷點(diǎn)2.6程序調(diào)試與異常處理2.6.1:程序調(diào)試7設(shè)置斷點(diǎn)后,該行的左側(cè)空白處將出現(xiàn)紅色的小圓點(diǎn),這是斷點(diǎn)的標(biāo)志。在單擊移除之前,這個(gè)斷點(diǎn)將永遠(yuǎn)存在??梢酝ㄟ^(guò)單擊【調(diào)試】菜單中的【窗口】子菜單項(xiàng),在彈出的子菜單中選擇【斷點(diǎn)】命令打開斷點(diǎn)對(duì)話框,查看現(xiàn)在設(shè)置的所有斷點(diǎn)的位置。2.6程序調(diào)試與異常處理2.6.1:程序調(diào)試8單擊菜單【調(diào)試】→【啟動(dòng)】運(yùn)行程序后,當(dāng)程序運(yùn)行到斷點(diǎn)行時(shí)暫停執(zhí)行。暫停執(zhí)行時(shí),當(dāng)前代碼行用箭頭標(biāo)示。鼠標(biāo)移動(dòng)到變量上時(shí),會(huì)提示變量?jī)?nèi)容。同時(shí)也可以借助其他工具查看內(nèi)存內(nèi)容。2.6程序調(diào)試與異常處理2.6.1:程序調(diào)試9運(yùn)行程序后,當(dāng)執(zhí)行到有斷點(diǎn)的那一行時(shí)程序就會(huì)中斷,這時(shí)可以有3種方法繼續(xù)執(zhí)行:1)按“F5”鍵繼續(xù)執(zhí)行,當(dāng)遇到下一個(gè)斷點(diǎn)的時(shí)候才會(huì)再次中斷。2)按“F10”鍵繼續(xù)執(zhí)行,每次只單步執(zhí)行,如果涉及到函數(shù),不能進(jìn)入到所執(zhí)行的函數(shù)的內(nèi)部。3)按“F11”鍵繼續(xù)執(zhí)行,也是單步執(zhí)行,如果涉及到函數(shù),能夠進(jìn)入到所執(zhí)行的函數(shù)的內(nèi)部。2.6程序調(diào)試與異常處理2.6.1:程序調(diào)試10監(jiān)視監(jiān)視窗口可以顯示變量,對(duì)象和表達(dá)式在程序執(zhí)行過(guò)程中值的變化情況。2.6程序調(diào)試與異常處理2.6.1:程序調(diào)試11監(jiān)視窗口中,還可以單擊左邊的“+”號(hào)打開對(duì)象的數(shù)據(jù)成員,這樣可以觀察變量在窗口中的變化情況。另外,監(jiān)視窗口也可以用來(lái)查看寄存器和編譯器在編譯程序時(shí)產(chǎn)生的代碼。2.6程序調(diào)試與異常處理2.6.1:程序調(diào)試12調(diào)用堆棧調(diào)用堆棧反映了當(dāng)前斷點(diǎn)處函數(shù)是被哪些函數(shù)按照什么順序調(diào)用的。在調(diào)用堆棧對(duì)話框中顯示了一個(gè)調(diào)用系列,最上面的是當(dāng)前函數(shù),往下依次是調(diào)用函數(shù)的上級(jí)函數(shù)。單擊這些函數(shù)名可以跳到對(duì)應(yīng)的函數(shù)中去。2.6程序調(diào)試與異常處理2.6.1:程序調(diào)試13內(nèi)存由于指針指向的數(shù)組在監(jiān)視中只能顯示第一個(gè)元素的值。為了顯示數(shù)組的后續(xù)內(nèi)容,可以打開內(nèi)存對(duì)話框,在其中輸入地址,就可以顯示該地址指向的內(nèi)存的內(nèi)容。2.6程序調(diào)試與異常處理2.6.1:程序調(diào)試14局部變量顯示所有當(dāng)前執(zhí)行上下文中可見的變量的值。特別是當(dāng)前指令涉及的變量,以紅色顯示局部變量對(duì)話框內(nèi)的內(nèi)容是隨著程序的執(zhí)行自動(dòng)進(jìn)行內(nèi)容更新的,不需要進(jìn)行手動(dòng)的調(diào)整。2.6程序調(diào)試與異常處理2.6.1:程序調(diào)試15寄存器顯示當(dāng)前的所有寄存器的值。寄存器是CPU內(nèi)部重要的數(shù)據(jù)存儲(chǔ)資源,是匯編程序員能直接使用的硬件資源之一。2.6程序調(diào)試與異常處理2.6.1:程序調(diào)試16斷點(diǎn)顯示程序內(nèi)所有標(biāo)有斷點(diǎn)的位置2.6程序調(diào)試與異常處理2.6.1:程序調(diào)試17調(diào)試信息的設(shè)置不同的調(diào)試信息用于滿足各種不同級(jí)別調(diào)試的需要。2.6程序調(diào)試與異常處理2.6.1:程序調(diào)試18在“調(diào)試信息格式”下拉列表框中可供選擇的調(diào)試信息方式包括:1)禁用:沒有調(diào)試信息。2)C7兼容:目標(biāo)文件或者可執(zhí)行文件中包含行號(hào)和所有符號(hào)調(diào)試信息,包括變量名及類型,函數(shù)及原型等。3)程序數(shù)據(jù)庫(kù):創(chuàng)建一個(gè)程序庫(kù)文件(PDB格式),包括類型信息和符號(hào)調(diào)試信息。4)用于“編輯并繼續(xù)”的程序數(shù)據(jù)庫(kù):除了具備程序數(shù)據(jù)庫(kù)的功能外,這個(gè)選項(xiàng)允許對(duì)代碼進(jìn)行調(diào)試過(guò)程中的修改和繼續(xù)執(zhí)行。5)從父級(jí)或項(xiàng)目默認(rèn)設(shè)置繼承:表示使用默認(rèn)設(shè)置。2.6程序調(diào)試與異常處理2.6.1:程序調(diào)試19異常Exception是程序可能檢測(cè)到的運(yùn)行時(shí)刻不正常的情況,如被0除,數(shù)組越界訪問或空閑存儲(chǔ)內(nèi)存耗盡等等。C++提供了內(nèi)置的語(yǔ)言特性來(lái)產(chǎn)生并處理異常,這些語(yǔ)言特性將激活了一種運(yùn)行時(shí)刻機(jī)制,通過(guò)這種機(jī)制可在C++程序的兩個(gè)無(wú)關(guān),常常是獨(dú)立開發(fā)的部分進(jìn)行異常通信。2.6程序調(diào)試與異常處理2.6.2:異常處理20拋出異??赏ㄟ^(guò)throw表達(dá)式來(lái)實(shí)現(xiàn),throw表達(dá)式看起來(lái)非常像return語(yǔ)句,throw表達(dá)式由關(guān)鍵字throw后面跟一個(gè)表達(dá)式構(gòu)成,該表達(dá)式的類型是被拋出異常的類型。例如以下帶代碼拋出了不同類型的異常。throw10;//拋出整型throw3.4f;//拋出浮點(diǎn)型throw"ok";//拋出字符串2.6程序調(diào)試與異常處理2.6.2:異常處理21在拋出異常中,最常使用的是拋出一個(gè)異常類的對(duì)象。例如以下代碼。#include<iostream>usingnamespacestd;classNumberExc{public: NumberExc(){cout<<"捕獲到異常"<<endl;}};voidTestFunction(){ throwNumberExc();}intmain(){ return0;}2.6程序調(diào)試與異常處理2.6.2:異常處理22try塊必須包圍能夠拋出異常的語(yǔ)句,try塊以關(guān)鍵字try開始,后面是花括號(hào)括起來(lái)的語(yǔ)句序列,在try塊之后是一組處理代碼,被稱為catch子句,try塊把語(yǔ)句分成組,并將其與相應(yīng)地處理這些語(yǔ)句可能拋出的異常的處理語(yǔ)句相關(guān)聯(lián)。例如以下代碼,try塊將檢測(cè)以下三個(gè)函數(shù)中是否有拋出的異常。 try
{ TestFunction1(); TestFunction2(); TestFunction3(); } catch(NumberExc)
{
}2.6程序調(diào)試與異常處理2.6.2:異常處理23處理異常的的控制流下列幾種情況之一:如果沒有異常發(fā)生,則執(zhí)行try塊中的代碼,和try塊相關(guān)聯(lián)的處理代碼被忽略。如果第一個(gè)函數(shù)TestFunction1拋出一個(gè)異常,則后2個(gè)函數(shù)和try塊被退出,執(zhí)行NumberExc類型異常的處理代碼。需要注意的是try塊可以包含任何C++語(yǔ)句表達(dá)式以及聲明,一個(gè)try塊引入一個(gè)局部域,在try塊內(nèi)聲明的變量不能在try塊外被引用,包括在catch子句中。2.6程序調(diào)試與異常處理2.6.2:異常處理24終上所述,所以當(dāng)某條語(yǔ)句拋出異常時(shí),跟在該語(yǔ)句后面的語(yǔ)句將被跳過(guò),程序執(zhí)行權(quán)被轉(zhuǎn)交給處理異常的catch子句。例如測(cè)試以下代碼,可以看到拋出異常函數(shù)之后的函數(shù)都未運(yùn)行。#include<iostream>usingnamespacestd;classNumberExc{public: NumberExc(){cout<<"捕獲到異常"<<endl;}};voidTestFunction1(){ throwNumberExc();}voidTestFunction2(){ cout<<"function2"<<endl;}2.6程序調(diào)試與異常處理2.6.2:異常處理25voidTestFunction3(){ cout<<"function3"<<endl;}intmain(){ try
{ TestFunction1(); TestFunction2(); TestFunction3(); } catch(NumberExc)
{
} return0;}2.6程序調(diào)試與異常處理2.6.2:異常處理26C++異常處理代碼是catch子句,當(dāng)一個(gè)異常被try塊中的語(yǔ)句拋出時(shí),系統(tǒng)通過(guò)查看跟在try塊后面的catch子句列表,來(lái)查找能夠處理該異常的catch子句。一個(gè)catch子句由三部分構(gòu)成,關(guān)鍵字catch,在括號(hào)中的單個(gè)類型或單個(gè)對(duì)象聲明被稱作異常聲明,以及復(fù)合語(yǔ)句中的語(yǔ)句。如果選擇了一個(gè)catch子句來(lái)處理一個(gè)異常,則執(zhí)行相應(yīng)的復(fù)合語(yǔ)句。2.6程序調(diào)試與異常處理2.6.2:異常處理27當(dāng)拋出的異常為類的時(shí)候,可以通過(guò)使用類的構(gòu)造函數(shù)的辦法讓catch語(yǔ)句捕獲到異常數(shù)據(jù),例如以下代碼。classNumberExc{public: NumberExc(int_n)
{ num=_n; cout<<"捕獲到異常"<<endl;
} intnum;};voidTestFunction1(){ throwNumberExc(24);}2.6程序調(diào)試與異常處理2.6.2:異常處理28獲得異常的數(shù)據(jù)就較為簡(jiǎn)單了,只需在catch子句中創(chuàng)建類對(duì)象,然后再?gòu)?fù)合語(yǔ)句中就能訪問到了,例如以下代碼。 try
{ TestFunction1(); TestFunction2(); TestFunction3(); } catch(NumberExcne)
{ cout<<"錯(cuò)誤代碼為"<<ne.num<<endl;
}2.6程序調(diào)試與異常處理2.6.2:異常處理29異常處理機(jī)制中,通過(guò)throw語(yǔ)句拋出異常后,系統(tǒng)“跳轉(zhuǎn)”到捕獲異常的catch塊去執(zhí)行,而且在執(zhí)行完那一catch塊后將不再返回(到throw語(yǔ)句之后),繼而轉(zhuǎn)到catch塊序列的最后一個(gè)catch塊的“下一語(yǔ)句”處去執(zhí)行。正是由于這種“跳轉(zhuǎn)”后的不再返回,當(dāng)拋出異常的throw語(yǔ)句處于某一下屬層次的局部作用域(如某個(gè)局部塊作用域或某個(gè)函數(shù)作用域)之中時(shí),throw的“跳轉(zhuǎn)”實(shí)際上相當(dāng)于跳出了那些作用域,所以系統(tǒng)將自動(dòng)檢查在那些作用域中已經(jīng)構(gòu)造但尚未析構(gòu)的處于堆棧中的局部對(duì)象(與變量),并自動(dòng)進(jìn)行相應(yīng)的退棧與析構(gòu)處理。2.6程序調(diào)試與異常處理2.6.2:異常處理30應(yīng)把處理程序異常的代碼與正常操作的實(shí)現(xiàn)分離開,因?yàn)檫@個(gè)策略會(huì)使得代碼更易于跟隨和維護(hù)。例如以下代碼設(shè)計(jì)一個(gè)針對(duì)數(shù)字處理異常的類。classNumberExc{public: NumberExc()
{ cout<<"捕獲到異常"<<endl;
} voidproZero(){cout<<"除數(shù)為"<<endl;} voidproMax(){cout<<"數(shù)字過(guò)大"<<endl;} voidproMin(){cout<<"數(shù)字過(guò)小"<<endl;}};2.6程序調(diào)試與異常處理2.6.3:異常處理的應(yīng)用31使用這個(gè)類進(jìn)行異常處理的代碼如下。voidTestFunction2(intival){ if(0==ival) throwNumberExc();}try{ TestFunction1(); TestFunction2(); TestFunction3();}catch(NumberExcne){ Zero();}catch(NumberExcne){ Max();}catch(NumberExcne){ Min();}2.6程序調(diào)試與異常處理2.6.3:異常處理的應(yīng)用32例如以下異常類,在拋出異常的時(shí)候會(huì)將一個(gè)異常代碼傳遞到異常類的構(gòu)造函數(shù)里。classNumberExc{public: NumberExc(int_excNum)
{ errorNum=_excNum; cout<<"捕獲到異常"<<endl;
} voidproExc()
{ switch(ExcNum)
{ case0: cout<<"除數(shù)為"<<endl; break; case1: cout<<"數(shù)字過(guò)大"<<endl; break; case2: cout<<"數(shù)字過(guò)小"<<endl; break;
}
} intExcNum;};2.6程序調(diào)試與異常處理2.6.3:異常處理的應(yīng)用33在可能發(fā)生異常的地方只需要要異常代碼提供給拋出異常類的構(gòu)造函數(shù)。voidTestFunction1(int
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度茶樓租賃合同茶樓與茶藝培訓(xùn)學(xué)校合作框架協(xié)議
- 二零二五年度在線教育平臺(tái)師資聘用協(xié)議
- 食用菌種植技術(shù)服務(wù)合同
- 英語(yǔ)語(yǔ)法中的定語(yǔ)從句詳解:九年級(jí)英語(yǔ)語(yǔ)法基礎(chǔ)強(qiáng)化教案
- 幼兒園繪本閱讀感悟分享
- 產(chǎn)品分銷銷售服務(wù)條款及目標(biāo)協(xié)定
- 數(shù)據(jù)驅(qū)動(dòng)的環(huán)保產(chǎn)業(yè)發(fā)展戰(zhàn)略協(xié)議
- 提升職場(chǎng)技能與素質(zhì)
- 數(shù)理化習(xí)題集:高三化學(xué)知識(shí)點(diǎn)強(qiáng)化練習(xí)計(jì)劃
- 家電產(chǎn)品渠道經(jīng)銷協(xié)議
- 2025年黑龍江農(nóng)業(yè)工程職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)及答案1套
- 《勞動(dòng)法常識(shí)(第3版)》中職全套教學(xué)課件
- 2025年勞動(dòng)合同延期補(bǔ)充協(xié)議模板
- 2025年日歷表(含農(nóng)歷、節(jié)假日、記事、A4打印版)
- 《反家庭暴力》課件
- 二零二五年度房地產(chǎn)預(yù)售合同協(xié)議4篇
- 2025-2030年中國(guó)天線行業(yè)市場(chǎng)需求狀況規(guī)劃研究報(bào)告
- 2024年南京旅游職業(yè)學(xué)院高職單招職業(yè)技能測(cè)驗(yàn)歷年參考題庫(kù)(頻考版)含答案解析
- 如何提升自我管理能力
- 2025年潛江市城市建設(shè)發(fā)展集團(tuán)招聘工作人員【52人】高頻重點(diǎn)提升(共500題)附帶答案詳解
- 人教版(新)九年級(jí)下冊(cè)化學(xué)全冊(cè)教案教學(xué)設(shè)計(jì)及教學(xué)反思
評(píng)論
0/150
提交評(píng)論