調(diào)試技術(shù)與異常處理_第1頁
調(diào)試技術(shù)與異常處理_第2頁
調(diào)試技術(shù)與異常處理_第3頁
調(diào)試技術(shù)與異常處理_第4頁
調(diào)試技術(shù)與異常處理_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第10章 調(diào)試技術(shù)與異常處理學習目標:掌握非中斷和中斷模式下程序的調(diào)試技術(shù)學會對程序運行中的錯誤進行處理10.1 程序的調(diào)試技術(shù) 程序中出現(xiàn)錯誤是在所難免的,雖然VS 2005的代碼編輯器能夠?qū)⒊绦蛑谐霈F(xiàn)的語法錯誤和可能出現(xiàn)的編譯錯誤自動檢測出來,但很多情況下,錯誤只在程序運行期間才發(fā)生。例如一個簡單的按鈕引用錯誤,代碼編輯器并不能自動檢測出來,而這卻很有可能引發(fā)程序的崩潰。使用VS 2005的調(diào)試技術(shù),可以跟蹤應用程序的執(zhí)行狀況,對可能引發(fā)程序錯誤的代碼進行修改;另外,為了對可能發(fā)生錯誤的地方采取預防措施,程序員還可以編寫有足夠彈性的代碼來處理可能出現(xiàn)的程序異常。 調(diào)試應用程序的目的是為了查

2、看它們是否按照程序員希望的那樣來運行,如果不是,則修改它們。VS 2005的調(diào)試可以在兩種模式下進行:中斷模式和非中斷(正常)模式。 非中斷模式下的調(diào)試技術(shù)輸出調(diào)試信息:在程序運行期間可以通過在【輸出】窗口輸出信息來跟蹤程序的執(zhí)行狀況,以查看程序是否正常運轉(zhuǎn),可以使用如下兩個命令:Debug.WriteLine()Trace.WriteLine() 這兩個命令的使用方法和Console.WriteLine()相似,唯一區(qū)別在于這兩個命令的字符串參數(shù)用戶輸出消息,不需要使用X語法插入變量值。另外,Debug.WriteLine()僅在調(diào)試模式下運行,而Trace.WriteLine()還可用于應

3、用程序的發(fā)布。實際上,Debug.WriteLine()甚至不能編譯為可發(fā)布的程序,在發(fā)布版本中,該命令會消失(應用程序一般包括兩個版本:調(diào)試版本和發(fā)布版本)。設置跟蹤點: 使用Debug.WriteLine()命令需要修改程序代碼,VS 2005提供了另外一種將信息輸出到【輸出】窗口的方法:設置跟蹤點,這種方法不需要修改代碼。將鼠標光標放置到要插入跟蹤點的代碼行上右擊(跟蹤點會在執(zhí)行該行代碼前進行處理),在彈出菜單中選擇【斷點】|【插入跟蹤點】命令,在打開的【命中斷點時】對話框中,選中【打印消息】復選框,并在下面的文本框中輸入要輸出的字符串,單擊【確定】按鈕,包含該跟蹤點的代碼行左側(cè)將出現(xiàn)一

4、個紅色的菱形,該行代碼也將顯示為紅色。 如果要禁用或臨時禁用某個跟蹤點,可右擊該跟蹤點,從彈出菜單中選擇相應的命令。禁用的跟蹤點在代碼編輯器中顯示為菱形框,而不是實心菱形。可通過【斷點】窗口快速查看應用程序中所有的跟蹤點。 中斷模式下的調(diào)試技術(shù)中斷模式下的調(diào)試是指先暫停應用程序的執(zhí)行,再進行調(diào)試,或者注上標記,以便以后進行分析。斷點的作用和添加方式進入中斷模式跟蹤變量值單步執(zhí)行代碼調(diào)用堆棧斷點是應用程序在調(diào)試時自動進入中斷模式的標記,通過它們,可以:在遇到斷點時,立即進入中斷模式;在遇到斷點時,如果布爾表達式的值為True,則進入中斷模式;遇到某斷點的次數(shù)達到一定程度后,進入中斷模式;在遇到某

5、斷點時,如果自從上次遇到該斷點以來變量的值發(fā)生了變化,就進入中斷模式;將字符串信息輸出到調(diào)試窗口中,或者執(zhí)行一個宏。添加斷點 刪除斷點 設置斷點條件 設置斷點命中次數(shù)當應用程序的斷點被觸發(fā)時,便自動進入中斷模式,中斷的代碼行將呈黃色高亮顯示。除此之外,進入中斷模式最簡單的方式是在調(diào)試應用程序時,單擊調(diào)試工具欄的【暫?!堪粹o。在VS 2005環(huán)境下調(diào)試應用程序時,可以利用其提供的工具來跟蹤和監(jiān)視變量的值:運行應用程序,程序?qū)⒃谠摂帱c位置進入中斷模式,用鼠標指向該行代碼中的變量名,系統(tǒng)將自動就會出現(xiàn)一個黃色的工具提示,顯示該變量的信息,包括變量的當前值。還可以高亮顯示整個表達式,以相同的方式查看表

6、達式的值,對于比較復雜的數(shù)據(jù)結(jié)構(gòu),如數(shù)組、枚舉等,還可以擴展工具欄中的提示,查看其中元素的值。調(diào)試界面底部左側(cè)的3個窗口在調(diào)試時非常有用,可以在中斷模式下,在跟蹤并監(jiān)控應用程序的變量值。每個窗口都包含了一個變量列表,提供了變量的名稱、值和類型等信息?!揪植孔兞俊看翱陲@示了作用域內(nèi)的所有變量,可在該窗口編輯變量的值,該值可以有效繞過前面代碼中的對變量的賦值,只需在【值】列對應的位置輸入一個新值即可?!颈O(jiān)視】窗口可用于監(jiān)視特定變量或涉及變量的表達式,只需在【變量】列輸入變量名或表達式,就可以查看它們的結(jié)果,還可以在【監(jiān)視】窗口中訪問變量的各種結(jié)果,顯示變量在斷點之間的變化情況。進入中斷模式后,利用

7、調(diào)試工具欄的按鈕可以實現(xiàn)語句的單步執(zhí)行,即一次執(zhí)行一條語句。如果要查看應用程序在運行時的每個執(zhí)行步驟,可以單擊【逐語句】按鈕,應用程序?qū)⒅鹦袌?zhí)行;如果要跳過代碼塊(如方法、循環(huán)等),可以單擊【逐過程】按鈕,應用程序?qū)⑻龇椒ɑ蜓h(huán),直接執(zhí)行后面的語句;如果對執(zhí)行的方法代碼體不感興趣,可以單擊【跳出】按鈕,返回調(diào)用該方法的語句。在含有語義錯誤的代碼中,使用單步調(diào)試是十分有效的,當執(zhí)行到有錯誤的代碼時,錯誤就會像正常運行程序的那樣發(fā)生。在這個過程中,可以監(jiān)視數(shù)據(jù),看看在什么地方出錯?!菊{(diào)用堆?!课挥赩S 2005程序運行環(huán)境的右下側(cè),該窗口描述了應用程序是如何執(zhí)行到當前位置的,也就是說,顯示了程序

8、的調(diào)用記錄。如果雙擊其中一項,就會移動到相應的位置,跟蹤代碼執(zhí)行到當前位置的過程。在第一次檢測錯誤時,該窗口非常有用,可以用來查看錯誤發(fā)生的情況,對于常用函數(shù)中出現(xiàn)的錯誤,該窗口有助于找到錯誤的源頭。10.2 處理異常 異常是程序中產(chǎn)生的錯誤,或者在運行期間由代碼調(diào)用產(chǎn)生的錯誤。這里的“錯誤”定義比較含糊,因為我們不能肯定錯誤會不會發(fā)生,例如方法的參數(shù)和傳遞過來的參數(shù)類型不一致等都可能引發(fā)異常。此時,最好的方法就是預料可能出現(xiàn)的錯誤,編寫足夠強壯的代碼以處理這些錯誤,而不必中斷程序的運行。 .NET Framework提供了許多處理異常的類,它們在命名空間中定義,大多數(shù)異常的名稱都說明了它們的

9、用途,例如“IOException”定義I/O錯誤時引發(fā)的異常,“IndexOutOfRangeException”定義數(shù)組下標越界引發(fā)的異常等。 trycatchfinallyC#語言提供了結(jié)構(gòu)化異常處理(SHE,Structured Exception Handling)的語法,關(guān)鍵字可以標記出處理異常的代碼和命令,如果發(fā)生異常,就使用這些代碼來處理異常。用于處理異常的3個關(guān)鍵字是try、catch、finally,它們都有一個關(guān)聯(lián)的代碼塊,必須在連續(xù)的代碼行中使用。private void OpenFileDialog() try richTextBox.Clear(); this.Te

10、xt = this.filename; richTextBox.Text = File.ReadAllText(this.filename); catch(IOException ex) MessageBox.Show(ex.Message, "編輯器", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 上訴代碼中沒有使用finally塊,也可以只有try塊和finally塊,而沒有catch塊,或者一個try塊和多個catch塊。它們的用法如下。try塊:提供產(chǎn)生或?qū)е庐惓5拇a;catch塊:提供發(fā)生異常時要執(zhí)行的代

11、碼。catch塊可以包含參數(shù),以響應特定的異常類型,因而可以提供多個catch塊,也可以不包含任何參數(shù),以響應所有的異常;finnaly塊:提供總是會執(zhí)行的代碼。如果沒有產(chǎn)生異常,就在try塊之后執(zhí)行,如果處理了異常,就在catch塊之后執(zhí)行,或者在未處理的異常中斷應用程序之前執(zhí)行。在try塊中的代碼發(fā)生異常后,事件的發(fā)生順序如下: try塊在發(fā)生異常的地方中斷程序的運行。如果有catch塊,就檢查該塊是否匹配所發(fā)生的異常類型,如果匹配,就執(zhí)行它所包含的代碼,如果提供有finally塊,就繼續(xù)執(zhí)行finally塊中的代碼;如果該catch塊與發(fā)生的異常不匹配,就檢查是否有其他的catch塊與發(fā)

12、生的異常匹配,如果有就執(zhí)行,然后繼續(xù)執(zhí)行finally塊(前提是提供了該塊),如果沒有就直接執(zhí)行finally塊中的代碼(如果沒有catch塊,程序中就必須有finally塊)。 列出和配置異常.NET Framework包含許多異常類型,可以通過對它們進行配置,使得在代碼中自由產(chǎn)生和處理此類異常,甚至在復雜的應用程序中捕獲。選擇【調(diào)試】|【異?!棵睿蜷_【異?!繉υ捒?,可通過該對話框查看和編輯可用的異常。【異常】對話框中的異常按照類別和.NET庫命名空間列出,展開“Common Language Runtime Exceptions”|“System”節(jié)點,便可以查看System命名空間中的所有異常。每個異常度可以使用右邊的復選框來加以配置。選中某個異常對應【引發(fā)】列的復選框,當應用程序發(fā)生此類異常時,便會中斷調(diào)試器;選中【用戶未處理的】列的復選框,當應用程序發(fā)生此類異常時,如果用戶沒有編寫處理程序,應用程序便會忽略該異常。不過,在大多情況下,使用VS 2005默認的配置就已經(jīng)足夠了。 處理異常時的注意事項引發(fā)和處理異常時,應用程序?qū)⒑馁M大量的系統(tǒng)資源和執(zhí)行時間。引發(fā)異常只是為了處理確實異常的情況,而不是為了處理可預知的事件或流控制。例如如果方法參數(shù)無效,而應用程序需要使用有效的參數(shù)來調(diào)用方法,無效的方法參數(shù)意味著出現(xiàn)了異常情況,此時便需要引發(fā)和處理異常。相反,用戶偶爾會輸入

溫馨提示

  • 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

提交評論