C# Ch7程序調(diào)試與異常處理_第1頁
C# Ch7程序調(diào)試與異常處理_第2頁
C# Ch7程序調(diào)試與異常處理_第3頁
C# Ch7程序調(diào)試與異常處理_第4頁
C# Ch7程序調(diào)試與異常處理_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第七章程序調(diào)試與異常處理

1.總體要求了解程序錯誤的3種類型。熟練運用VisualStudio.Net2010的調(diào)試器調(diào)試程序錯誤。解異常和異常處理的概念。學會使用try-catch-finally及throw語句來捕獲和處理異常。2.學習重點調(diào)試程序錯誤的方法。y-catch-finally結(jié)構(gòu)及其使用方法。第七章程序調(diào)試與異常處理主要內(nèi)容7.1程序錯誤7.2程序的異常處理7.1程序錯誤7.1.1程序錯誤分類7.1.2調(diào)試程序錯誤

返回7.1.1程序錯誤分類在編寫程序時,我們經(jīng)常會遇到各種各樣的錯誤,這些錯誤中有些容易發(fā)現(xiàn)和解決,有些則比較隱蔽甚至很難發(fā)現(xiàn)。C#程序錯誤總體上可以歸納為3類:語法錯誤、邏輯錯誤和運行時錯誤。1.語法錯誤語法錯誤是指不符合C#語法規(guī)則的程序錯誤。例如,變量名的拼寫錯誤、數(shù)據(jù)類型錯誤、標點符號的丟失、括號不匹配等。語法錯誤是3類程序錯誤中最容易發(fā)現(xiàn)也是最容易解決的一類錯誤,發(fā)生在源代碼的編寫過程中。在VisualStudio.Net2010中,源代碼編輯器能自動識別語法錯誤,并用紅色波浪線標記錯誤。只要將鼠標停留在帶有此標記的代碼上,就會顯示出其錯誤信息,同時顯示在錯誤列表窗口中。7.1.1程序錯誤分類如圖7-1所示,語句應該以英文分號結(jié)尾,而不是以中文分號結(jié)尾。7.1.1程序錯誤分類其實,語法錯誤是可以避免的。VisualStudio.Net2010提供了強大的智能感知技術(shù),要盡量利用該技術(shù)輔助書寫源程序,不但可提高錄入速度,還可以避免語法錯誤。如圖7-2所示,當輸入了“Convert.”時,系統(tǒng)會自動顯示Convert類的所有成員方法,通過光標移動鍵查找并定位于某個方法,按空格鍵,即可完成相關(guān)諸如“Convert.ToDateTime”之類的錄入操作。7.1.1程序錯誤分類2.邏輯錯誤邏輯錯誤通常不會引起程序本身的運行異常。因為分析和設(shè)計不充分,造成程序算法有缺陷或完全錯誤,這樣根據(jù)錯誤的算法書寫程序,自然不會獲得預期的運行結(jié)果。因此邏輯錯誤的實質(zhì)是算法錯誤,是最不容易發(fā)現(xiàn)的,也是最難解決的,必須重新檢查程序的流程是否正確以及算法是否與要求相符,有時可能需要逐步地調(diào)試分析,甚至還要適當?shù)靥砑訉iT的調(diào)試分析代碼來查找其出錯的原因和位置。邏輯錯誤無法依靠.NET編譯器進行檢查,只有依靠程序設(shè)計員認真、不懈的努力才能解決。正因如此,尋找新算法、排除邏輯錯誤才是廣大程序設(shè)計員的價值所在。7.1.1程序錯誤分類3.運行時錯誤運行時錯誤是指在應用程序試圖執(zhí)行系統(tǒng)無法執(zhí)行的操作時產(chǎn)生的錯誤,也就是我們所說的系統(tǒng)報錯。這類錯誤編譯器是無法自動檢查出來的,通常需要對輸入的代碼進行手動檢查并更正?!緦嵗?-1】設(shè)計一個Windows程序,求每隔3個位置上的2個數(shù)組元素之和,并保存在前一元素中7.1.2調(diào)試程序錯誤1.VisualStudio.Net2010的調(diào)試方式VisualStudio.Net2010提供多種調(diào)試方式,包括逐語句方式、逐過程方式和斷點方式等。其中,逐語句方式和逐過程方式都是逐行執(zhí)行程序代碼,所不同的是,當遇到方法調(diào)用時,前者將進入方法體內(nèi)繼續(xù)逐行執(zhí)行,而后者不會進入方法體內(nèi)跟蹤方法本身的代碼。所以如果在調(diào)試的過程中想避免執(zhí)行方法體內(nèi)的代碼,就可以使用逐過程方式;相反,如果想查看方法體代碼是否出錯,就得使用逐語句方式。在VisualStudio.Net2010中,選擇“調(diào)試”菜單的“逐語句”命令(如圖7-4所示)或者按<F11>,可啟用逐語句方式,連續(xù)按<F11>可跟蹤每一條語句的執(zhí)行。而選擇“調(diào)試”菜單的“逐過程”命令或者按<F10>,可啟用逐過程方式。7.1.2調(diào)試程序錯誤2.VisualStudio.Net2010的斷點方式通過逐行執(zhí)行程序來尋找錯誤,效果確實很棒。但是,對于較大規(guī)模的程序或者已經(jīng)知道錯誤范圍的程序,使用逐語句方式或逐過程方式,都是沒有必要的。為此,可使用斷點方式調(diào)試程序。斷點是一個標志,它通知調(diào)試器應該在某處中斷應用程序并暫停執(zhí)行。與逐行執(zhí)行不同的是,斷點方式可以讓程序一直執(zhí)行,直到遇到斷點才開始調(diào)試。顯然,這將大大加快調(diào)試過程。VisualStudio.Net2010允許在源程序中設(shè)置多個斷點。7.1.2調(diào)試程序錯誤設(shè)置斷點的操作方法如下:右擊想要設(shè)置斷點的代碼行,選擇“斷點→插入斷點”命令即可;也可以單擊源代碼行左邊的灰色區(qū)域;或者將插入點定位于想以設(shè)置斷點的代碼行,再按<F9>。如圖7-6所示,斷點以紅色圓點表示,并且該行代碼也高亮顯示。7.1.2調(diào)試程序錯誤3.人工尋找邏輯錯誤在眾多的程序錯誤中,有些錯誤是很難發(fā)現(xiàn)的,尤其是邏輯錯誤,即便是功能強大的調(diào)試器也顯得無能為力。這時可以適當?shù)丶尤胍恍┤斯げ僮?,以便快速地找到錯誤。常見的方法有兩種:(1)注釋可能出錯的代碼。這是一種比較有效的尋找錯誤的策略。如果注釋掉部分代碼后,程序就能正常運行,那么就能肯定該代碼出錯了;反之,錯誤應該在別處。(2)適當?shù)靥砑右恍┹敵稣Z句,再觀察是否成功顯示輸出信息,即可判斷包含該輸出語句的分支和循環(huán)結(jié)構(gòu)是否有邏輯錯誤,從而進一步分析錯誤的原因。7.2程序的異常處理7.2.1異常的概念7.2.2try-catch語句與異常處理7.2.3finally語句7.2.4throw語句與拋出異常返回7.2.1異常的概念一個優(yōu)秀的程序員在編寫程序時,不僅要關(guān)心代碼正常的控制流程,同時也要把握好系統(tǒng)可能隨時發(fā)生的不可預期的事件。它們可能來自系統(tǒng)本身,如內(nèi)存不夠、磁盤出錯、網(wǎng)絡連接中斷、數(shù)據(jù)庫無法使用等;也可能來自用戶,如非法輸入等,一旦發(fā)生這些事件,程序都將無法正常運行。所謂異常就是那些能影響程序正常執(zhí)行的事件,而對這些事件的處理方法稱為異常處理。異常處理是必不可少的,它可以防止程序處于非正常狀態(tài),并可根據(jù)不同類型的錯誤來執(zhí)行不同的處理方法。7.2.1異常的概念【實例7-2】設(shè)計一個Windows程序,首先,使用TextBox控件構(gòu)建單價和數(shù)量的操作界面,然后編程計算金額。在本例中,造成異常的原因是:TextBox控件本身不具備限制用戶輸入的功能,設(shè)計人員又按常規(guī)進行設(shè)計,但當用戶不按常規(guī)輸入數(shù)據(jù)時,系統(tǒng)自然發(fā)生異常。所以,如果不想讓程序因出現(xiàn)異常而被系統(tǒng)中斷或退出的話,必須構(gòu)建相應的異常處理機制。7.2.2try-catch語句與異常處理

在開發(fā)應用程序的過程中,可以假定任何代碼塊都有可能引發(fā)異常,特別是CLR本身可能引發(fā)的異常,例如溢出、數(shù)組越界、除數(shù)為0等。為了能夠?qū)Ξ惓S行幚恚珻#的提供了try-catch語句,其格式一般如下:try{

語句塊1//可能引發(fā)異常的代碼}cacth(異常對象)//捕獲異常類對象{

語句塊2//實現(xiàn)異常處理}7.2.2try-catch語句與異常處理try-catch語句的邏輯含義為:先試著執(zhí)行可能引發(fā)異常的“語句塊1”,如果發(fā)生異常,則由系統(tǒng)自動捕獲并將相關(guān)信息封裝保存到“異常對象”之中,然后執(zhí)行“語句塊2”,實現(xiàn)異常處理;如果未發(fā)生異常,則跳過catch子句,繼續(xù)執(zhí)行try-catch之后的語句7.2.2try-catch語句與異常處理【實例7-3】修改實例7-2,添加異常處理功能。7.2.2try-catch語句與異常處理使用try-catch語句時,特別要注意以下兩點:(1)catch子語中的異常對象可以省略。如果省略異常對象,則默認為CLR的異常類對象,否則為指定的異常類的對象。(2)由于try子句中代碼有可能引發(fā)不只一種異常,因此C#允許針對不同的異常,定義多個不同的cacth子句。當try子句拋出異常時,系統(tǒng)將根據(jù)異常類型順序查找并執(zhí)行對應的catch子句,實現(xiàn)特定異常處理。7.2.3finally語句在try-catch語句中,只有捕獲到了異常,才會執(zhí)行cacth子句中的代碼。但還有一些比較特殊的操作,比如文件的關(guān)閉、網(wǎng)絡連接的斷開以及數(shù)據(jù)庫操作中鎖的釋放等,應該是無論是否發(fā)生異常都必須執(zhí)行,否則會造成系統(tǒng)資源的占用和不必要的浪費。類似這些無論是否捕捉到異常都必須執(zhí)行的代碼,可用finally關(guān)鍵字定義。7.2.3finally語句finally語句常常與try-cacth語句搭配使用,其完整格式:

try

{

語句塊1//可能引發(fā)異常的代碼

}

cacth(異常對象)//捕獲異常類對象

{

語句塊2//實現(xiàn)異常處理

}

finally

{

語句塊3//無論是否異常,都作最后處理

}7.2.3finally語句【實例7-4】設(shè)計一個Windows應用程序,實現(xiàn)用于捕獲創(chuàng)建新文件時因該文件已經(jīng)存在而引發(fā)的異常,并且最后無論是否捕獲到異常都要關(guān)閉文件。7.2.4throw語句與拋出異常前面所捕獲到的異常,都是當遇到錯誤時,系統(tǒng)自己報錯,自動通知運行環(huán)境異常的發(fā)生。但是有時還可以在代碼中手動地告知運行環(huán)境在什么時候發(fā)生了什么異常。C#提供的throw語句可手動拋出一個異常,使用格式如下:throw[異常對象]//提供有關(guān)拋出的異常信息當省略異常對象時,該語句只能用在catch語句中,用于再次引發(fā)異常處理。當throw語句帶有異常對象時,則拋出指定的異常類,并顯示異常的相關(guān)信息。該異常既可以是預定義的異常類,也可以是自定義的異常類。7.2.4throw語句與拋出異常在同一個try-catch語句中可以使用一個以上的特定catch

子句。這種情況下catch

子句的順序很重要,因為會按順序檢查catch

子句。將先捕獲特定程度較高的異常,而不是特定程度較小的異常。在catch

塊中可以使用throw語句再次引發(fā)已由catch

語句捕獲的異常。例如:

catch(InvalidCastExceptione){throw(e);//Rethrowingexceptione}7.2.4throw語句與拋出異常如

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論