版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第七章程序調(diào)試與異常處理
1.總體要求了解程序錯(cuò)誤的3種類型。熟練運(yùn)用VisualStudio.Net2010的調(diào)試器調(diào)試程序錯(cuò)誤。解異常和異常處理的概念。學(xué)會(huì)使用try-catch-finally及throw語句來捕獲和處理異常。2.學(xué)習(xí)重點(diǎn)調(diào)試程序錯(cuò)誤的方法。y-catch-finally結(jié)構(gòu)及其使用方法。第七章程序調(diào)試與異常處理主要內(nèi)容7.1程序錯(cuò)誤7.2程序的異常處理7.1程序錯(cuò)誤7.1.1程序錯(cuò)誤分類7.1.2調(diào)試程序錯(cuò)誤
返回7.1.1程序錯(cuò)誤分類在編寫程序時(shí),我們經(jīng)常會(huì)遇到各種各樣的錯(cuò)誤,這些錯(cuò)誤中有些容易發(fā)現(xiàn)和解決,有些則比較隱蔽甚至很難發(fā)現(xiàn)。C#程序錯(cuò)誤總體上可以歸納為3類:語法錯(cuò)誤、邏輯錯(cuò)誤和運(yùn)行時(shí)錯(cuò)誤。1.語法錯(cuò)誤語法錯(cuò)誤是指不符合C#語法規(guī)則的程序錯(cuò)誤。例如,變量名的拼寫錯(cuò)誤、數(shù)據(jù)類型錯(cuò)誤、標(biāo)點(diǎn)符號(hào)的丟失、括號(hào)不匹配等。語法錯(cuò)誤是3類程序錯(cuò)誤中最容易發(fā)現(xiàn)也是最容易解決的一類錯(cuò)誤,發(fā)生在源代碼的編寫過程中。在VisualStudio.Net2010中,源代碼編輯器能自動(dòng)識(shí)別語法錯(cuò)誤,并用紅色波浪線標(biāo)記錯(cuò)誤。只要將鼠標(biāo)停留在帶有此標(biāo)記的代碼上,就會(huì)顯示出其錯(cuò)誤信息,同時(shí)顯示在錯(cuò)誤列表窗口中。7.1.1程序錯(cuò)誤分類如圖7-1所示,語句應(yīng)該以英文分號(hào)結(jié)尾,而不是以中文分號(hào)結(jié)尾。7.1.1程序錯(cuò)誤分類其實(shí),語法錯(cuò)誤是可以避免的。VisualStudio.Net2010提供了強(qiáng)大的智能感知技術(shù),要盡量利用該技術(shù)輔助書寫源程序,不但可提高錄入速度,還可以避免語法錯(cuò)誤。如圖7-2所示,當(dāng)輸入了“Convert.”時(shí),系統(tǒng)會(huì)自動(dòng)顯示Convert類的所有成員方法,通過光標(biāo)移動(dòng)鍵查找并定位于某個(gè)方法,按空格鍵,即可完成相關(guān)諸如“Convert.ToDateTime”之類的錄入操作。7.1.1程序錯(cuò)誤分類2.邏輯錯(cuò)誤邏輯錯(cuò)誤通常不會(huì)引起程序本身的運(yùn)行異常。因?yàn)榉治龊驮O(shè)計(jì)不充分,造成程序算法有缺陷或完全錯(cuò)誤,這樣根據(jù)錯(cuò)誤的算法書寫程序,自然不會(huì)獲得預(yù)期的運(yùn)行結(jié)果。因此邏輯錯(cuò)誤的實(shí)質(zhì)是算法錯(cuò)誤,是最不容易發(fā)現(xiàn)的,也是最難解決的,必須重新檢查程序的流程是否正確以及算法是否與要求相符,有時(shí)可能需要逐步地調(diào)試分析,甚至還要適當(dāng)?shù)靥砑訉iT的調(diào)試分析代碼來查找其出錯(cuò)的原因和位置。邏輯錯(cuò)誤無法依靠.NET編譯器進(jìn)行檢查,只有依靠程序設(shè)計(jì)員認(rèn)真、不懈的努力才能解決。正因如此,尋找新算法、排除邏輯錯(cuò)誤才是廣大程序設(shè)計(jì)員的價(jià)值所在。7.1.1程序錯(cuò)誤分類3.運(yùn)行時(shí)錯(cuò)誤運(yùn)行時(shí)錯(cuò)誤是指在應(yīng)用程序試圖執(zhí)行系統(tǒng)無法執(zhí)行的操作時(shí)產(chǎn)生的錯(cuò)誤,也就是我們所說的系統(tǒng)報(bào)錯(cuò)。這類錯(cuò)誤編譯器是無法自動(dòng)檢查出來的,通常需要對(duì)輸入的代碼進(jìn)行手動(dòng)檢查并更正。【實(shí)例7-1】設(shè)計(jì)一個(gè)Windows程序,求每隔3個(gè)位置上的2個(gè)數(shù)組元素之和,并保存在前一元素中7.1.2調(diào)試程序錯(cuò)誤1.VisualStudio.Net2010的調(diào)試方式VisualStudio.Net2010提供多種調(diào)試方式,包括逐語句方式、逐過程方式和斷點(diǎn)方式等。其中,逐語句方式和逐過程方式都是逐行執(zhí)行程序代碼,所不同的是,當(dāng)遇到方法調(diào)用時(shí),前者將進(jìn)入方法體內(nèi)繼續(xù)逐行執(zhí)行,而后者不會(huì)進(jìn)入方法體內(nèi)跟蹤方法本身的代碼。所以如果在調(diào)試的過程中想避免執(zhí)行方法體內(nèi)的代碼,就可以使用逐過程方式;相反,如果想查看方法體代碼是否出錯(cuò),就得使用逐語句方式。在VisualStudio.Net2010中,選擇“調(diào)試”菜單的“逐語句”命令(如圖7-4所示)或者按<F11>,可啟用逐語句方式,連續(xù)按<F11>可跟蹤每一條語句的執(zhí)行。而選擇“調(diào)試”菜單的“逐過程”命令或者按<F10>,可啟用逐過程方式。7.1.2調(diào)試程序錯(cuò)誤2.VisualStudio.Net2010的斷點(diǎn)方式通過逐行執(zhí)行程序來尋找錯(cuò)誤,效果確實(shí)很棒。但是,對(duì)于較大規(guī)模的程序或者已經(jīng)知道錯(cuò)誤范圍的程序,使用逐語句方式或逐過程方式,都是沒有必要的。為此,可使用斷點(diǎn)方式調(diào)試程序。斷點(diǎn)是一個(gè)標(biāo)志,它通知調(diào)試器應(yīng)該在某處中斷應(yīng)用程序并暫停執(zhí)行。與逐行執(zhí)行不同的是,斷點(diǎn)方式可以讓程序一直執(zhí)行,直到遇到斷點(diǎn)才開始調(diào)試。顯然,這將大大加快調(diào)試過程。VisualStudio.Net2010允許在源程序中設(shè)置多個(gè)斷點(diǎn)。7.1.2調(diào)試程序錯(cuò)誤設(shè)置斷點(diǎn)的操作方法如下:右擊想要設(shè)置斷點(diǎn)的代碼行,選擇“斷點(diǎn)→插入斷點(diǎn)”命令即可;也可以單擊源代碼行左邊的灰色區(qū)域;或者將插入點(diǎn)定位于想以設(shè)置斷點(diǎn)的代碼行,再按<F9>。如圖7-6所示,斷點(diǎn)以紅色圓點(diǎn)表示,并且該行代碼也高亮顯示。7.1.2調(diào)試程序錯(cuò)誤3.人工尋找邏輯錯(cuò)誤在眾多的程序錯(cuò)誤中,有些錯(cuò)誤是很難發(fā)現(xiàn)的,尤其是邏輯錯(cuò)誤,即便是功能強(qiáng)大的調(diào)試器也顯得無能為力。這時(shí)可以適當(dāng)?shù)丶尤胍恍┤斯げ僮?,以便快速地找到錯(cuò)誤。常見的方法有兩種:(1)注釋可能出錯(cuò)的代碼。這是一種比較有效的尋找錯(cuò)誤的策略。如果注釋掉部分代碼后,程序就能正常運(yùn)行,那么就能肯定該代碼出錯(cuò)了;反之,錯(cuò)誤應(yīng)該在別處。(2)適當(dāng)?shù)靥砑右恍┹敵稣Z句,再觀察是否成功顯示輸出信息,即可判斷包含該輸出語句的分支和循環(huán)結(jié)構(gòu)是否有邏輯錯(cuò)誤,從而進(jìn)一步分析錯(cuò)誤的原因。7.2程序的異常處理7.2.1異常的概念7.2.2try-catch語句與異常處理7.2.3finally語句7.2.4throw語句與拋出異常返回7.2.1異常的概念一個(gè)優(yōu)秀的程序員在編寫程序時(shí),不僅要關(guān)心代碼正常的控制流程,同時(shí)也要把握好系統(tǒng)可能隨時(shí)發(fā)生的不可預(yù)期的事件。它們可能來自系統(tǒng)本身,如內(nèi)存不夠、磁盤出錯(cuò)、網(wǎng)絡(luò)連接中斷、數(shù)據(jù)庫(kù)無法使用等;也可能來自用戶,如非法輸入等,一旦發(fā)生這些事件,程序都將無法正常運(yùn)行。所謂異常就是那些能影響程序正常執(zhí)行的事件,而對(duì)這些事件的處理方法稱為異常處理。異常處理是必不可少的,它可以防止程序處于非正常狀態(tài),并可根據(jù)不同類型的錯(cuò)誤來執(zhí)行不同的處理方法。7.2.1異常的概念【實(shí)例7-2】設(shè)計(jì)一個(gè)Windows程序,首先,使用TextBox控件構(gòu)建單價(jià)和數(shù)量的操作界面,然后編程計(jì)算金額。在本例中,造成異常的原因是:TextBox控件本身不具備限制用戶輸入的功能,設(shè)計(jì)人員又按常規(guī)進(jìn)行設(shè)計(jì),但當(dāng)用戶不按常規(guī)輸入數(shù)據(jù)時(shí),系統(tǒng)自然發(fā)生異常。所以,如果不想讓程序因出現(xiàn)異常而被系統(tǒng)中斷或退出的話,必須構(gòu)建相應(yīng)的異常處理機(jī)制。7.2.2try-catch語句與異常處理
在開發(fā)應(yīng)用程序的過程中,可以假定任何代碼塊都有可能引發(fā)異常,特別是CLR本身可能引發(fā)的異常,例如溢出、數(shù)組越界、除數(shù)為0等。為了能夠?qū)Ξ惓S行幚?,C#的提供了try-catch語句,其格式一般如下:try{
語句塊1//可能引發(fā)異常的代碼}cacth(異常對(duì)象)//捕獲異常類對(duì)象{
語句塊2//實(shí)現(xiàn)異常處理}7.2.2try-catch語句與異常處理try-catch語句的邏輯含義為:先試著執(zhí)行可能引發(fā)異常的“語句塊1”,如果發(fā)生異常,則由系統(tǒng)自動(dòng)捕獲并將相關(guān)信息封裝保存到“異常對(duì)象”之中,然后執(zhí)行“語句塊2”,實(shí)現(xiàn)異常處理;如果未發(fā)生異常,則跳過catch子句,繼續(xù)執(zhí)行try-catch之后的語句7.2.2try-catch語句與異常處理【實(shí)例7-3】修改實(shí)例7-2,添加異常處理功能。7.2.2try-catch語句與異常處理使用try-catch語句時(shí),特別要注意以下兩點(diǎn):(1)catch子語中的異常對(duì)象可以省略。如果省略異常對(duì)象,則默認(rèn)為CLR的異常類對(duì)象,否則為指定的異常類的對(duì)象。(2)由于try子句中代碼有可能引發(fā)不只一種異常,因此C#允許針對(duì)不同的異常,定義多個(gè)不同的cacth子句。當(dāng)try子句拋出異常時(shí),系統(tǒng)將根據(jù)異常類型順序查找并執(zhí)行對(duì)應(yīng)的catch子句,實(shí)現(xiàn)特定異常處理。7.2.3finally語句在try-catch語句中,只有捕獲到了異常,才會(huì)執(zhí)行cacth子句中的代碼。但還有一些比較特殊的操作,比如文件的關(guān)閉、網(wǎng)絡(luò)連接的斷開以及數(shù)據(jù)庫(kù)操作中鎖的釋放等,應(yīng)該是無論是否發(fā)生異常都必須執(zhí)行,否則會(huì)造成系統(tǒng)資源的占用和不必要的浪費(fèi)。類似這些無論是否捕捉到異常都必須執(zhí)行的代碼,可用finally關(guān)鍵字定義。7.2.3finally語句finally語句常常與try-cacth語句搭配使用,其完整格式:
try
{
語句塊1//可能引發(fā)異常的代碼
}
cacth(異常對(duì)象)//捕獲異常類對(duì)象
{
語句塊2//實(shí)現(xiàn)異常處理
}
finally
{
語句塊3//無論是否異常,都作最后處理
}7.2.3finally語句【實(shí)例7-4】設(shè)計(jì)一個(gè)Windows應(yīng)用程序,實(shí)現(xiàn)用于捕獲創(chuàng)建新文件時(shí)因該文件已經(jīng)存在而引發(fā)的異常,并且最后無論是否捕獲到異常都要關(guān)閉文件。7.2.4throw語句與拋出異常前面所捕獲到的異常,都是當(dāng)遇到錯(cuò)誤時(shí),系統(tǒng)自己報(bào)錯(cuò),自動(dòng)通知運(yùn)行環(huán)境異常的發(fā)生。但是有時(shí)還可以在代碼中手動(dòng)地告知運(yùn)行環(huán)境在什么時(shí)候發(fā)生了什么異常。C#提供的throw語句可手動(dòng)拋出一個(gè)異常,使用格式如下:throw[異常對(duì)象]//提供有關(guān)拋出的異常信息當(dāng)省略異常對(duì)象時(shí),該語句只能用在catch語句中,用于再次引發(fā)異常處理。當(dāng)throw語句帶有異常對(duì)象時(shí),則拋出指定的異常類,并顯示異常的相關(guān)信息。該異常既可以是預(yù)定義的異常類,也可以是自定義的異常類。7.2.4throw語句與拋出異常在同一個(gè)try-catch語句中可以使用一個(gè)以上的特定catch
子句。這種情況下catch
子句的順序很重要,因?yàn)闀?huì)按順序檢查catch
子句。將先捕獲特定程度較高的異常,而不是特定程度較小的異常。在catch
塊中可以使用throw語句再次引發(fā)已由catch
語句捕獲的異常。例如:
catch(InvalidCastExceptione){throw(e);//Rethrowingexceptione}7.2.4throw語句與拋出異常如
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高考數(shù)學(xué)全真模擬試題第12571期
- 江蘇省徐州市銅山區(qū)2023-2024學(xué)年九年級(jí)上學(xué)期期中物理試卷(含答案解析)
- 2024至2030年中國(guó)早茶點(diǎn)心車數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2024至2030年中國(guó)手動(dòng)平移氣調(diào)庫(kù)門行業(yè)投資前景及策略咨詢研究報(bào)告
- 2010-2012年非離子表面活性劑市場(chǎng)研究及預(yù)測(cè)分析報(bào)告
- 2024至2030年中國(guó)塑料馬甲袋數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2024至2030年中國(guó)單筒紫外線凈水器數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2024至2030年中國(guó)沖孔新型板數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2024年新疆維吾爾自治區(qū)中考語文試題含解析
- 2024年中國(guó)鏡架配件市場(chǎng)調(diào)查研究報(bào)告
- 2024-2025學(xué)年人教版數(shù)學(xué)三年級(jí)上冊(cè) 第三單元 測(cè)量 單元測(cè)試卷(含答案)
- 2024新信息科技三年級(jí)第四單元:創(chuàng)作數(shù)字作品大單元整體教學(xué)設(shè)計(jì)
- 第一單元達(dá)標(biāo)練習(xí)(單元練習(xí))-2024-2025學(xué)年語文一年級(jí)上冊(cè)(統(tǒng)編版)
- 2024年水電暖安裝合同模板
- TBIA 22-2024 骨科疾病診療數(shù)據(jù)集-頸椎退行性疾病
- 考研英語模擬試題一
- 2024至2030年中國(guó)油茶行業(yè)發(fā)展策略分析及投資前景研究報(bào)告
- 三年級(jí)語文《那次玩得真高興:記一次游戲的感受》說課課件
- 《人工智能與大數(shù)據(jù)技術(shù)》高職全套教學(xué)課件
- 2023-2024學(xué)年廣東省深圳市龍崗區(qū)滬教牛津版(深圳用)六年級(jí)上冊(cè)期中英語試卷(無答案)
- 2024年新蘇教版六年級(jí)上冊(cè)科學(xué)全冊(cè)知識(shí)點(diǎn)(超全)
評(píng)論
0/150
提交評(píng)論