




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
目錄第10章程序調(diào)試與異常處理10.1VisualStudio編輯器10.2使用VisualStudio調(diào)試C#代碼10.3斷點(diǎn)設(shè)置與程序調(diào)試方法10.4異常處理9.1VisualStudio編輯器程序員開(kāi)發(fā)的應(yīng)用程序的代碼必須準(zhǔn)確、安全。準(zhǔn)確指的是應(yīng)用程序運(yùn)行無(wú)錯(cuò)誤且能得到正確的結(jié)果,而安全指的是應(yīng)用程序能處理運(yùn)行過(guò)程可能出現(xiàn)的異常。程序設(shè)計(jì)過(guò)程中不可避免出現(xiàn)這樣或那樣、或多或少的錯(cuò)誤,且有些錯(cuò)誤很難發(fā)現(xiàn)。為了排除這些錯(cuò)誤特別是非常隱蔽的錯(cuò)誤,對(duì)編寫(xiě)的程序代碼需要進(jìn)行調(diào)試,而VisualStudioC#IDE環(huán)境提供了調(diào)試的手段,快速定位錯(cuò)誤信息。對(duì)于程序安全問(wèn)題,C#語(yǔ)言提供了異常處理語(yǔ)句,通過(guò),NET框架提供的一套稱(chēng)為結(jié)構(gòu)化異常處理的標(biāo)準(zhǔn)錯(cuò)誤機(jī)制,捕捉并處理出現(xiàn)預(yù)期之外時(shí)的異常事件。既然IDE環(huán)境是程序編輯的窗口,首先要了解編輯器功能和特點(diǎn)。
9.1VisualStudio編輯器VisualStudio編輯器提供了許多功能,可方便我們更加輕松地編寫(xiě)和管理代碼和文本
編輯器功能如下:①語(yǔ)法著色用不同顏色對(duì)程序中的代碼和某些語(yǔ)法元素著色,從而將它們區(qū)分開(kāi)來(lái)。例如,關(guān)鍵字(如C#中的using)用一種顏色,類(lèi)型(如Console用另一種顏色。也為其他語(yǔ)法元素(如字符串文本和注釋?zhuān)┲?。C++使用顏色來(lái)區(qū)分類(lèi)型、枚舉、宏以及其他標(biāo)記②錯(cuò)誤和警告標(biāo)記添加代碼和生成解決方案時(shí),可能會(huì)看到(a)不同顏色的波浪下劃線(稱(chēng)為波形曲線)或者(b)燈泡顯示在你的代碼中。紅色波浪線表示語(yǔ)法錯(cuò)誤,藍(lán)色表示編譯器錯(cuò)誤,綠色表示警告,而紫色表示其他類(lèi)型的錯(cuò)誤③括號(hào)匹配插入點(diǎn)放置在代碼文件中的左大括號(hào)上時(shí),將突出顯示左大括號(hào)和右大括號(hào)。此功能可為你提供有關(guān)錯(cuò)放或丟失大括號(hào)的即時(shí)反饋??梢允褂谩白詣?dòng)突出顯示分隔符”設(shè)置來(lái)啟用或禁用大括號(hào)匹配(“工具”>“選項(xiàng)”>“文本編輯器”)??梢栽凇白煮w和顏色”設(shè)置中更改突出顯示顏色(“工具”>“選項(xiàng)”>“環(huán)境”)。查找“大括號(hào)匹配(突出顯示)”或“大括號(hào)匹配(方括號(hào))”。9.1VisualStudio編輯器④結(jié)構(gòu)可視化工具在代碼文件中,成對(duì)的大括號(hào)用虛線相連,方便你更加輕松地辨別左大括號(hào)和右大括號(hào)對(duì)。這樣一來(lái),你可以在代碼庫(kù)中更快速地找到代碼??梢允褂谩肮ぞ摺?gt;“選項(xiàng)”>“文本編輯器”>“常規(guī)”頁(yè)上“顯示”部分中的“顯示結(jié)構(gòu)準(zhǔn)則”啟用或禁用這些代碼行⑤行號(hào)可在代碼窗口的左邊距中顯示行號(hào)。默認(rèn)情況下不顯示行號(hào)??稍凇拔谋揪庉嬈鞯乃姓Z(yǔ)言”設(shè)置中啟用此選項(xiàng)(“工具”>“選項(xiàng)”>“文本編輯器”>“所有語(yǔ)言”)??梢酝ㄟ^(guò)更改各編程語(yǔ)言的設(shè)置來(lái)顯示其行號(hào)(“工具”>“選項(xiàng)”>“文本編輯器”>“<語(yǔ)言>”)。對(duì)于要打印的行號(hào),必須在“打印”對(duì)話(huà)框中選擇“包括行號(hào)”⑥更改跟蹤左邊距的顏色使你能夠跟蹤在文件中所做的更改。打開(kāi)文件后所做的未保存的更改將由左邊距上的黃色欄(稱(chēng)為選定內(nèi)容的邊距)表示。保存更改后(但在關(guān)閉文件前),該欄將變?yōu)榫G色。如果在保存文件后撤消更改,則該欄將變?yōu)槌壬?。若要禁用和啟用此功能,?qǐng)?jiān)凇拔谋揪庉嬈鳌痹O(shè)置中更改“跟蹤更改”選項(xiàng)(“工具”>“選項(xiàng)”>“文本編輯器”)9.1VisualStudio編輯器⑦選擇代碼和文本可以在標(biāo)準(zhǔn)的連續(xù)流模式或框模式中選擇文本,你將在其中選擇一個(gè)矩形部分的文本而非一組文本行。若要在框模式中進(jìn)行選擇,請(qǐng)?jiān)趯⑹髽?biāo)拖到選定內(nèi)容上時(shí)按下Alt(或按Alt+Shift+<箭頭鍵>)。選定內(nèi)容包括由所選范圍中第一個(gè)字符和最后一個(gè)字符所定義的矩形內(nèi)的所有字符。鍵入或粘貼到所選區(qū)域內(nèi)的任何內(nèi)容均將在每行中的相同點(diǎn)插入⑧縮放可以通過(guò)按住Ctrl鍵并移動(dòng)鼠標(biāo)滾輪(或按Ctrl+Shift+.放大,按Ctrl+Shift+,縮小)。可以使用代碼窗口左下角的“縮放”框設(shè)置特定的縮放百分比??s放功能不適用于工具窗口⑨虛空格默認(rèn)情況下,VisualStudio編輯器中的行在最后一個(gè)字符后結(jié)束,從而行尾的向右鍵會(huì)將光標(biāo)移到下一行的開(kāi)頭。在某些其他編輯器中,行并不在最后一個(gè)字符后結(jié)束,你可以將光標(biāo)放置在行上的任意位置。可以在“工具”>“選項(xiàng)”>“文本編輯器”>“所有語(yǔ)言”設(shè)置中啟用編輯器中的虛空格。請(qǐng)注意,可以啟用“虛空格”或“自動(dòng)換行”之一,但不能同時(shí)啟用這兩者9.1VisualStudio編輯器⑩打印打印文件時(shí),可以使用“打印”對(duì)話(huà)框中的選項(xiàng)來(lái)包括行號(hào)或隱藏折疊的代碼區(qū)域。在“頁(yè)面設(shè)置”對(duì)話(huà)框中,還可以通過(guò)選擇“頁(yè)面頁(yè)眉”來(lái)打印完整路徑及文件名??梢栽凇肮ぞ摺?gt;“選項(xiàng)”>“環(huán)境”>“字體和顏色”對(duì)話(huà)框中設(shè)置顏色打印選項(xiàng)。在“顯示以下對(duì)象的設(shè)置”列表中選擇“打印機(jī)”,以自定義彩色打印??梢詾榇蛴∥募蔷庉嬑募付ú煌念伾?全局撤消和重做“編輯”菜單上的“撤消上次全局操作”和“重做上一全局操作”命令可撤消或重做影響多個(gè)文件的全局操作。全局操作包括重命名類(lèi)或命名空間、在解決方案中執(zhí)行查找和替換操作、重構(gòu)數(shù)據(jù)庫(kù)或更改多個(gè)文件的任何其他操作??蓪?duì)當(dāng)前VisualStudio會(huì)話(huà)中的操作應(yīng)用全局撤消和重做命令(甚至在關(guān)閉應(yīng)用操作的解決方案之后)9.2使用VisualStudio調(diào)試C#代碼
當(dāng)調(diào)試應(yīng)用時(shí),通常意味著運(yùn)行附帶有調(diào)試器的應(yīng)用程序。執(zhí)行此操作時(shí),調(diào)試器在運(yùn)行過(guò)程中可提供許多方法讓我們查看代碼的情況。我們可以逐步瀏覽代碼、查看變量中存儲(chǔ)的值、設(shè)置對(duì)變量的監(jiān)視以查看值何時(shí)改變、檢查代碼的執(zhí)行路徑、查看代碼分支是否正在運(yùn)行等等
下面將通過(guò)分步演練以介紹VisualStudio調(diào)試器的一般功能9.2.1啟動(dòng)調(diào)試器①首先創(chuàng)建一個(gè)Windows平臺(tái)下的控制臺(tái)應(yīng)用程序項(xiàng)目,項(xiàng)目名稱(chēng)為“GetStartedDebugging”。具體過(guò)程略②創(chuàng)建應(yīng)用程序。在Program.cs中,將所有默認(rèn)代碼替換為以下代碼:usingSystem;classArrayExample{staticvoidMain(){char[]letters={'f','r','e','d','','s','m','i','t','h'};stringname="";int[]a=newint[10];for(inti=0;i<letters.Length;i++){name+=letters[i];a[i]=i+1;SendMessage(name,a[i]);}Console.ReadKey();}staticvoidSendMessage(stringname,intmsg){Console.WriteLine(name+"!Countto"+msg);}}9.2.1啟動(dòng)調(diào)試器③啟動(dòng)調(diào)試器此處我們主要使用的是鍵盤(pán)快捷方式,因?yàn)檫@樣可以快速執(zhí)行調(diào)試器命令。等效的命令(例如工具欄或菜單命令)也會(huì)注明。若要啟動(dòng)調(diào)試器,請(qǐng)按F5,或者從菜單欄中選擇“調(diào)試”>“開(kāi)始調(diào)試”按F5會(huì)啟動(dòng)應(yīng)用,并且調(diào)試器會(huì)附加到應(yīng)用進(jìn)程。由于我們尚未執(zhí)行任何特殊操作來(lái)檢查代碼,因此應(yīng)用將一直運(yùn)行到完成為止,并且你會(huì)看到控制臺(tái)輸出。f!Countto1fr!Countto2fre!Countto3fred!Countto4fred!Countto5freds!Countto6fredsm!Countto7fredsmi!Countto8fredsmit!Countto9fredsmith!Countto109.2.1啟動(dòng)調(diào)試器若要停止調(diào)試器,請(qǐng)按Shift+F5,或者在“調(diào)試”工具欄中選擇“停止調(diào)試”按鈕,或者從菜單欄中選擇“調(diào)試”>“停止調(diào)試”④關(guān)閉控制臺(tái)在控制臺(tái)窗口中,按任意鍵關(guān)閉控制臺(tái)窗口9.2.2設(shè)置斷點(diǎn)并啟動(dòng)調(diào)試器斷點(diǎn)是執(zhí)行可靠調(diào)試所不可或缺的一項(xiàng)功能。設(shè)置斷點(diǎn),以便VisualStudio在你設(shè)置的斷點(diǎn)處暫停正在運(yùn)行的代碼,這樣就可以查看變量值或內(nèi)存行為,或者確定代碼的分支是否已運(yùn)行①在Main函數(shù)的for循環(huán)中,通過(guò)單擊以下代碼行的左邊距來(lái)設(shè)置斷點(diǎn):name+=letters[i];設(shè)置斷點(diǎn)的位置會(huì)出現(xiàn)一個(gè)紅色圓圈9.2.2設(shè)置斷點(diǎn)并啟動(dòng)調(diào)試器②若要開(kāi)始調(diào)試,請(qǐng)按F5,或者在“標(biāo)準(zhǔn)”工具欄中選擇“調(diào)試目標(biāo)”按鈕,或者在“調(diào)試”工具欄中選擇“開(kāi)始調(diào)試”按鈕,或者從菜單欄中選擇“調(diào)試”>“開(kāi)始調(diào)試”。應(yīng)用隨即啟動(dòng),調(diào)試器將運(yùn)行到設(shè)置了斷點(diǎn)的代碼行黃色箭頭指向調(diào)試器暫停時(shí)所在的語(yǔ)句。應(yīng)用執(zhí)行將在同一位置暫停,此處的語(yǔ)句尚未執(zhí)行當(dāng)應(yīng)用未運(yùn)行時(shí),按F5會(huì)啟動(dòng)調(diào)試器。如果應(yīng)用在某個(gè)斷點(diǎn)處暫停,則按F5會(huì)繼續(xù)運(yùn)行該應(yīng)用,直至到達(dá)下一個(gè)斷點(diǎn)如果你知道自己要詳細(xì)檢查的代碼行或代碼段,則斷點(diǎn)功能非常有用9.2.3使用數(shù)據(jù)提示瀏覽代碼并檢查數(shù)據(jù)當(dāng)程序運(yùn)行到斷點(diǎn)位置,斷點(diǎn)位置的語(yǔ)句并未執(zhí)行,此時(shí)可以檢查變量的值,從值判斷結(jié)果是否正確。具體操作如下:①暫停于name+=letters[i]語(yǔ)句處時(shí),將鼠標(biāo)懸停在letters變量上,點(diǎn)開(kāi)箭頭以查看顯示數(shù)組大小和元素的數(shù)據(jù)提示②將鼠標(biāo)懸停在name變量上以查看其當(dāng)前值(一個(gè)空字符串)③若要使調(diào)試器前進(jìn)到下一條語(yǔ)句,請(qǐng)按F10,或者在“調(diào)試”工具欄中選擇“逐過(guò)程”按鈕,或者從菜單欄中選擇“調(diào)試”>“逐過(guò)程”。再按F10兩次以跳過(guò)SendMessage方法調(diào)用④按F10會(huì)使調(diào)試器前進(jìn),而不會(huì)單步執(zhí)行函數(shù)或方法,不過(guò),其代碼仍會(huì)執(zhí)行。這樣,就跳過(guò)了調(diào)試我們暫時(shí)不需要關(guān)注的SendMessage方法中的代碼9.2.3使用數(shù)據(jù)提示瀏覽代碼并檢查數(shù)據(jù)⑤若要迭代for循環(huán)幾次,請(qǐng)反復(fù)按F10。在每次循環(huán)迭代期間,請(qǐng)?jiān)跀帱c(diǎn)處暫停,然后將鼠標(biāo)懸停在name變量上以在數(shù)據(jù)提示中檢查其值⑥變量的值隨for循環(huán)的每次迭代而更改,顯示的值依次為f、fr、fre,依此類(lèi)推。若要使調(diào)試器在循環(huán)中更快前進(jìn),請(qǐng)按F5,這樣就會(huì)前進(jìn)到斷點(diǎn)而不是下一條語(yǔ)句⑦在Main方法的for循環(huán)中暫停時(shí),按F11,或者從“調(diào)試”工具欄中選擇“逐語(yǔ)句執(zhí)行”按鈕,或者從菜單欄中選擇“調(diào)試”>“逐語(yǔ)句執(zhí)行”,直至到達(dá)SendMessage方法調(diào)用應(yīng)在此代碼行處暫停調(diào)試器:SendMessage(name,a[i]);9.2.3使用數(shù)據(jù)提示瀏覽代碼并檢查數(shù)據(jù)⑧若要單步執(zhí)行SendMessage方法,請(qǐng)?jiān)俅伟碏11。黃色指針會(huì)前進(jìn)到SendMessage方法按F11可幫助你更深入地檢查代碼的執(zhí)行流。若要單步執(zhí)行方法調(diào)用中的方法,請(qǐng)按F11。調(diào)試完SendMessage方法后,可以返回到main方法的for循環(huán)⑨若要退出SendMessage方法,按Shift+F11,或者在“調(diào)試”工具欄中選擇“跳出”按鈕,或者從菜單欄中選擇“調(diào)試”>“跳出”?!疤觥睂⒒謴?fù)應(yīng)用執(zhí)行并使調(diào)試器前進(jìn),直到當(dāng)前方法或函數(shù)返回。將在Main方法的for循環(huán)中再次看到黃色指針,該指針暫停在SendMessage方法調(diào)用處。9.2.4使用”運(yùn)行到光標(biāo)處”調(diào)試程序在代碼編輯器中,將鼠標(biāo)懸停在SendMessage方法中的Console.WriteLine方法調(diào)用上,直到左側(cè)出現(xiàn)“運(yùn)行到單擊處”按鈕。按鈕的工具提示顯示“將執(zhí)行運(yùn)行到此處”選擇“運(yùn)行到光標(biāo)處”按鈕。或者,將光標(biāo)置于Console.WriteLine語(yǔ)句上,然后按Ctrl+F10?;蛘撸益I單擊Console.WriteLine方法調(diào)用,然后從上下文菜單中選擇“運(yùn)行到光標(biāo)處”調(diào)試器會(huì)前進(jìn)到Console.WriteLine方法調(diào)用使用“運(yùn)行到單擊處”按鈕類(lèi)似于設(shè)置臨時(shí)斷點(diǎn),在已打開(kāi)的文件的應(yīng)用代碼可見(jiàn)區(qū)域中,可以快速方便地使用這種方法9.2.5使用“自動(dòng)”和“局部變量”窗口檢查變量在調(diào)試時(shí),“自動(dòng)變量”和“局部變量”窗口會(huì)顯示變量值。這兩個(gè)窗口僅在調(diào)試會(huì)話(huà)期間才會(huì)顯示?!白詣?dòng)變量”窗口顯示調(diào)試器所在的當(dāng)前行和上一行中使用的變量?!熬植孔兞俊贝翱陲@示在局部范圍內(nèi)定義的變量,通常是當(dāng)前函數(shù)或方法。在調(diào)試器處于暫停狀態(tài)時(shí),查看代碼編輯器底部的“自動(dòng)變量”窗口。如果“自動(dòng)變量”窗口已關(guān)閉,請(qǐng)按下Ctrl+D和A,或者從菜單欄中選擇“調(diào)試”>“窗口”>“自動(dòng)變量”。在調(diào)試器仍處于暫停狀態(tài)的情況下,在“自動(dòng)變量”窗口旁邊的選項(xiàng)卡中查看“局部變量”窗口。如果“局部變量”窗口已關(guān)閉,請(qǐng)按下Ctrl+D和L,或者從菜單欄中選擇“調(diào)試”>“窗口”>“局部變量”。在“局部變量”窗口中,展開(kāi)letters變量以查看其數(shù)組元素以及這些元素的值。9.3斷點(diǎn)設(shè)置與程序調(diào)試方法
程序員在VisualStudioC#IDE環(huán)境輸入程序時(shí)所出現(xiàn)的一般語(yǔ)法錯(cuò)誤,在輸出窗口會(huì)給出錯(cuò)誤信息內(nèi)容、代碼、錯(cuò)誤位置,程序員可以及時(shí)糾正。而當(dāng)程序沒(méi)有語(yǔ)法錯(cuò)誤但運(yùn)行結(jié)果錯(cuò)誤或程序無(wú)法結(jié)束時(shí),則需要采用特殊的調(diào)試手段。常用的程序調(diào)試操作包括斷點(diǎn)調(diào)試、開(kāi)始執(zhí)行、中斷執(zhí)行、停止執(zhí)行、逐句執(zhí)行、逐過(guò)程執(zhí)行以及運(yùn)行到指定位置等,在這些調(diào)試手段中大多結(jié)合斷點(diǎn)一起
”逐語(yǔ)句”和”逐過(guò)程”的主要區(qū)別是當(dāng)某一行包含函數(shù)調(diào)用時(shí),”逐語(yǔ)句”將轉(zhuǎn)去執(zhí)行調(diào)用本身,然后在函數(shù)內(nèi)的第一個(gè)代碼行處停止;而”逐過(guò)程”執(zhí)行整個(gè)函數(shù),然后在函數(shù)外的第一行處停止。如果目前正位于函數(shù)調(diào)用的內(nèi)部,若想返回調(diào)用函數(shù)應(yīng)使用”跳出”命名
斷點(diǎn)是在調(diào)試過(guò)程中的一個(gè)重要概念,用于在程序執(zhí)行到指定位置時(shí)暫停執(zhí)行,以便程序員可以檢查程序狀態(tài)和變量值。斷點(diǎn)操作就是事先在程序代碼的某行設(shè)置斷點(diǎn),然后啟動(dòng)程序運(yùn)行。當(dāng)程序運(yùn)行到斷點(diǎn)位置,程序暫時(shí)中斷執(zhí)行,即程序處于中斷狀態(tài)。中斷狀態(tài)并不是終止或結(jié)束程序的執(zhí)行,僅僅是暫停,所有元素(如函數(shù)、變量、對(duì)象)都保留在內(nèi)存中,執(zhí)行可以在任何時(shí)候繼續(xù)。9.3.1斷點(diǎn)分類(lèi)①一般斷點(diǎn)(RegularBreakpoint):一般斷點(diǎn)是最常見(jiàn)的斷點(diǎn)類(lèi)型,它允許在程序執(zhí)行到特定行或指令時(shí)暫停。當(dāng)程序執(zhí)行到設(shè)置了一般斷點(diǎn)的位置時(shí),調(diào)試器會(huì)停止執(zhí)行并將控制權(quán)交給程序員,以便進(jìn)行調(diào)試②條件斷點(diǎn)(ConditionalBreakpoint):條件斷點(diǎn)允許您在滿(mǎn)足特定條件時(shí)暫停程序的執(zhí)行。您可以為斷點(diǎn)設(shè)置一個(gè)條件表達(dá)式,當(dāng)表達(dá)式的值為真時(shí),斷點(diǎn)將生效。這對(duì)于調(diào)試特定情況下的代碼問(wèn)題非常有用③跟蹤斷點(diǎn)(Tracepoint):跟蹤斷點(diǎn)是一種特殊類(lèi)型的斷點(diǎn),它不會(huì)暫停程序的執(zhí)行,而是在特定行或指令處記錄程序的執(zhí)行情況,例如函數(shù)被調(diào)用的次數(shù)或循環(huán)迭代的次數(shù)。這對(duì)于對(duì)程序執(zhí)行流程進(jìn)行統(tǒng)計(jì)和分析非常有用④臨時(shí)斷點(diǎn)(TemporaryBreakpoint):臨時(shí)斷點(diǎn)是一種臨時(shí)性的斷點(diǎn),它只會(huì)在程序第一次執(zhí)行到指定位置時(shí)生效,一旦程序執(zhí)行過(guò)一次后,該斷點(diǎn)就會(huì)被自動(dòng)刪除。這對(duì)于只需調(diào)試特定執(zhí)行路徑或場(chǎng)景的代碼很有用⑤依賴(lài)斷點(diǎn)(DependentBreakpoint):依賴(lài)斷點(diǎn)是一種斷點(diǎn)組合技術(shù),它依賴(lài)于其他斷點(diǎn)的狀態(tài)。例如,您可以設(shè)置一個(gè)依賴(lài)斷點(diǎn),該斷點(diǎn)只有在另一個(gè)斷點(diǎn)已經(jīng)被觸發(fā)過(guò)后才會(huì)生效。這對(duì)于需要在先前發(fā)生的特定事件之后調(diào)試的情況很有用9.3.2斷點(diǎn)的設(shè)置與程序操作在要設(shè)置斷點(diǎn)的行上右擊鼠標(biāo),則彈出一個(gè)界面,選擇”斷點(diǎn)”子菜單項(xiàng),展開(kāi)級(jí)聯(lián)菜單,展開(kāi)的子菜單顯示了不同類(lèi)型的斷點(diǎn)類(lèi)型圖標(biāo),且每種類(lèi)型前面顯示的各種幾何圖形就是該類(lèi)型斷點(diǎn)對(duì)應(yīng)的圖標(biāo)。如下圖所示:9.3.2.1
一般斷點(diǎn)的設(shè)置與程序調(diào)試方法⑴設(shè)置一般斷點(diǎn)打開(kāi)您的C#項(xiàng)目或文件,然后選擇要設(shè)置斷點(diǎn)的代碼行。在代碼行號(hào)的左側(cè)單擊一次,或使用快捷鍵F9,或右擊鼠標(biāo)選擇”斷點(diǎn)”->”一般斷點(diǎn)”,即可在該行設(shè)置一個(gè)一般斷點(diǎn)。一般斷點(diǎn)將顯示為紅色圓點(diǎn),表示已成功設(shè)置。⑵程序調(diào)試①啟動(dòng)調(diào)試:在VisualStudio中,通??梢酝ㄟ^(guò)以下幾種方式啟動(dòng)調(diào)試:按F5鍵,或者選擇“調(diào)試(D)"菜單,然后選擇“開(kāi)始執(zhí)行”或“開(kāi)始調(diào)試”選項(xiàng)。在工具欄上找到“開(kāi)始調(diào)試”按鈕并單擊它。②執(zhí)行程序:當(dāng)您啟動(dòng)調(diào)試后,程序?qū)㈤_(kāi)始執(zhí)行。當(dāng)程序執(zhí)行到設(shè)置的斷點(diǎn)位置時(shí),它將暫停執(zhí)行并顯示當(dāng)前代碼的狀態(tài)。9.3.2.1
一般斷點(diǎn)的設(shè)置與程序調(diào)試方法③調(diào)試過(guò)程:在斷點(diǎn)處,您可以查看當(dāng)前代碼的局部變量、全局變量和表達(dá)式的值使用調(diào)試器提供的控制按鈕(如繼續(xù)執(zhí)行、單步執(zhí)行、跳過(guò)、停止等)來(lái)控制程序的執(zhí)行流程。當(dāng)程序執(zhí)行過(guò)程中發(fā)現(xiàn)問(wèn)題時(shí),您可以使用“調(diào)試(D)”菜單中的“終止執(zhí)行”選項(xiàng)或按Shift+F5快捷鍵來(lái)停止調(diào)試④監(jiān)視和查看變量:在VisualStudio中,可以使用“調(diào)試(D)”菜單中的“查看”選項(xiàng)來(lái)查看變量的值,或使用快捷鍵Ctrl+Alt+Q,W來(lái)打開(kāi)“自動(dòng)”和“局部/全局”窗口,監(jiān)視變量的值變化⑤調(diào)試完成:當(dāng)您找到問(wèn)題并解決它后,或者調(diào)試過(guò)程完成后,可以停止調(diào)試并關(guān)閉VisualStudio9.3.2.1
一般斷點(diǎn)的設(shè)置與程序調(diào)試方法⑶刪除一般斷點(diǎn)方法在代碼編輯器中找到已設(shè)置斷點(diǎn)的行號(hào),可以通過(guò)檢查行號(hào)左側(cè)是否有紅色圓點(diǎn)來(lái)確認(rèn)斷點(diǎn)是否存在單擊斷點(diǎn)所在的行號(hào)的左側(cè)空白處,或者按下F9鍵。這將會(huì)移除已設(shè)置的斷點(diǎn),紅色圓點(diǎn)會(huì)消失,表示該斷點(diǎn)已被刪除如果您想刪除所有設(shè)置的斷點(diǎn),可以使用以下方法:在VisualStudio的頂部菜單欄中,選擇“調(diào)試(D)"菜單。在“調(diào)試(D)”菜單中,找到“刪除所有斷點(diǎn)”選項(xiàng),并單擊它?;蛘呤褂每旖萱ICtrl+Shift+F9。這將刪除項(xiàng)目中所有設(shè)置的斷點(diǎn),包括一般斷點(diǎn)和其他類(lèi)型的斷點(diǎn)9.3.2.1
一般斷點(diǎn)的設(shè)置與程序調(diào)試方法例如,以下程序的調(diào)試在第10行已經(jīng)設(shè)置了一個(gè)一般斷點(diǎn)。啟動(dòng)調(diào)試,當(dāng)程序第一次進(jìn)入do-while循環(huán)結(jié)構(gòu)就碰到斷點(diǎn)第10行,斷點(diǎn)標(biāo)記紅色實(shí)體圓上重疊了一個(gè)箭頭,表示程序目前在該位置進(jìn)入了中斷狀態(tài)此時(shí),可以在監(jiān)視窗口添加變量x,第一次顯示x的值為4;點(diǎn)擊上方”繼續(xù)”按鈕則程序繼續(xù)執(zhí)行,遇到斷點(diǎn)又暫停,這時(shí)看到監(jiān)視窗口x的值為5,依次類(lèi)推。直到發(fā)現(xiàn)問(wèn)題,停止調(diào)試,然后修改程序代碼直到正確為止9.3.2.2條件斷點(diǎn)的設(shè)置與程序調(diào)試方法⑴設(shè)置條件斷點(diǎn)①在代碼編輯器中找到您想要設(shè)置斷點(diǎn)的行號(hào)。單擊行號(hào)的左側(cè)空白處,或者按下F9鍵,設(shè)置一般斷點(diǎn)②右鍵單擊已設(shè)置的斷點(diǎn)(紅色圓點(diǎn)),然后選擇“條件(C)...”選項(xiàng)③在彈出的對(duì)話(huà)框中,輸入您希望作為條件的表達(dá)式。例如,可以輸入一個(gè)變量名,并指定當(dāng)該變量的值滿(mǎn)足某個(gè)條件時(shí)斷點(diǎn)生效④單擊“關(guān)閉”按鈕以應(yīng)用條件⑵程序調(diào)試①啟動(dòng)調(diào)試:在VisualStudio中,通常可以通過(guò)以下幾種方式啟動(dòng)調(diào)試:按F5鍵,或者選擇“調(diào)試(D)"菜單,然后選擇“開(kāi)始執(zhí)行”或“開(kāi)始調(diào)試”選項(xiàng)在工具欄上找到“開(kāi)始調(diào)試”按鈕并單擊它②執(zhí)行程序:當(dāng)您啟動(dòng)調(diào)試后,程序?qū)㈤_(kāi)始執(zhí)行。當(dāng)程序執(zhí)行到設(shè)置的條件斷點(diǎn)位置時(shí),只有在滿(mǎn)足設(shè)定的條件時(shí),斷點(diǎn)才會(huì)生效并暫停執(zhí)行9.3.2.2條件斷點(diǎn)的設(shè)置與程序調(diào)試方法③調(diào)試過(guò)程:在滿(mǎn)足條件時(shí),程序?qū)和?zhí)行并顯示當(dāng)前代碼的狀態(tài)。您可以查看當(dāng)前代碼的局部變量、全局變量和表達(dá)式的值,以及斷點(diǎn)條件是否滿(mǎn)足繼續(xù)執(zhí)行或修改條件:如果斷點(diǎn)條件滿(mǎn)足,并且您希望繼續(xù)執(zhí)行程序,可以使用調(diào)試器提供的控制按鈕繼續(xù)執(zhí)行如果在調(diào)試過(guò)程中發(fā)現(xiàn)條件不正確,您可以右鍵單擊斷點(diǎn),選擇“條件(C)...”選項(xiàng),并修改條件表達(dá)式④調(diào)試完成:當(dāng)您找到問(wèn)題并解決它后,或者調(diào)試過(guò)程完成后,可以停止調(diào)試并關(guān)閉VisualStudio通過(guò)條件斷點(diǎn),您可以更加精確地控制程序的執(zhí)行,并在特定條件滿(mǎn)足時(shí)進(jìn)行調(diào)試。這是一種非常有用的調(diào)試技術(shù),可以幫助您在復(fù)雜的代碼邏輯中快速定位問(wèn)題9.3.2.3跟蹤斷點(diǎn)的設(shè)置與程序調(diào)試方法⑴設(shè)置跟蹤斷點(diǎn)在代碼編輯器中找到您想要設(shè)置跟蹤斷點(diǎn)的行號(hào)。右鍵單擊行號(hào)的左側(cè)空白處,或者所在行右擊鼠標(biāo),選擇“條件性跟蹤(C)...”選項(xiàng)在彈出的對(duì)話(huà)框中,選擇您想要跟蹤的選項(xiàng),例如,函數(shù)調(diào)用次數(shù)、循環(huán)迭代次數(shù)等根據(jù)選項(xiàng)輸入相應(yīng)的條件表達(dá)式。例如,如果您選擇“函數(shù)調(diào)用次數(shù)”,則可以輸入CallCount>10,表示函數(shù)被調(diào)用的次數(shù)大于10時(shí)觸發(fā)跟蹤斷點(diǎn)單擊“確定”按鈕以應(yīng)用條件⑵程序調(diào)試程序調(diào)試方法與前面情況相同,不再贅述9.3.3執(zhí)行到光標(biāo)處程序調(diào)試開(kāi)始執(zhí)行是最基本的調(diào)試功能之一,可以配合斷點(diǎn)一塊調(diào)試。步驟如下:在”調(diào)試”菜單中選擇”開(kāi)始調(diào)試”命令,進(jìn)入代碼調(diào)試狀態(tài)(若要設(shè)置斷點(diǎn),則必須在開(kāi)始調(diào)試執(zhí)行前完成右擊代碼的某行,然后從彈出的快捷菜單中選擇”執(zhí)行到光標(biāo)處”(CtrlF10)命令,則程序執(zhí)行到斷點(diǎn)或光標(biāo)位置。值得說(shuō)明的是:如果斷點(diǎn)在前、光標(biāo)位置在后,則程序執(zhí)行到斷點(diǎn)位置暫停,否則程序執(zhí)行到光標(biāo)所在位置暫停。這時(shí)可以監(jiān)視關(guān)鍵參數(shù)的值,分析值的正確性,為程序糾錯(cuò)提供依據(jù)。9.4異常處理在C#中,異常(Exception)是指程序在運(yùn)行過(guò)程中遇到的錯(cuò)誤、問(wèn)題或異常情況,導(dǎo)致程序無(wú)法正常繼續(xù)執(zhí)行的情況。異常提供了一種機(jī)制,使程序能夠處理這些意外情況,而不會(huì)導(dǎo)致程序崩潰。C#中的異常是通過(guò)異常類(lèi)的實(shí)例來(lái)表示的,這些異常類(lèi)都繼承自System.Exception類(lèi)Exception(異常的基類(lèi)):這是所有異常的基類(lèi)。一般情況下,不會(huì)直接捕獲這個(gè)異常,而是捕獲它的子類(lèi)異常。C#中的異常由.NET框架中的異常類(lèi)表示,這些異常類(lèi)位于System命名空間下9.4.1常見(jiàn)異常類(lèi)①System.NullReferenceException(空引用異常):當(dāng)嘗試訪問(wèn)空對(duì)象(即為null的對(duì)象)的成員時(shí),會(huì)引發(fā)此異常。objectobj=null;intlength=obj.Length;//會(huì)拋出NullReferenceException②System.IndexOutOfRangeException(索引超出范圍異常):當(dāng)嘗試訪問(wèn)數(shù)組或集合中不存在的索引時(shí),會(huì)引發(fā)此異常。int[]array={1,2,3};intvalue=array[5];//會(huì)拋出IndexOutOfRangeException③System.FormatException(格式化異常):當(dāng)嘗試將一個(gè)無(wú)效格式的字符串轉(zhuǎn)換為其他類(lèi)型(如數(shù)字或日期)時(shí),會(huì)引發(fā)此異常。stringtext="abc";intnumber=int.Parse(text);//會(huì)拋出FormatException9.4.1常見(jiàn)異常類(lèi)④System.ArgumentException(參數(shù)異常):當(dāng)傳遞給方法的參數(shù)無(wú)效或不合法時(shí),會(huì)引發(fā)此異常。⑤System.ArithmeticException(算術(shù)異常):例如,除以零時(shí)拋出的異常。⑥System.ArgumentNullException(參數(shù)為空異常):當(dāng)傳遞給方法的參數(shù)為null時(shí)拋出的異常。除了以上列舉的異常之外,C#還提供了許多其他異常類(lèi)型,以便開(kāi)發(fā)人員能夠更好地識(shí)別和處理不同的錯(cuò)誤情況。9.4.2異常類(lèi)屬性為了更好地展示異常信息,每個(gè)異常對(duì)象中都包含一些只讀屬性,這些屬性可以描述異常信息,通過(guò)這些屬性可以更準(zhǔn)確地找到異常出現(xiàn)的原因,具體如下。①M(fèi)essage:Message屬性用于獲取異常的描述性錯(cuò)誤消息。這通常是開(kāi)發(fā)人員可以閱讀的文本,用于解釋異常的原因。try{//可能會(huì)引發(fā)異常的代碼}catch(Exceptionex){stringerrorMessage=ex.Message;}②StackTrace:StackTrace屬性提供了引發(fā)異常的堆棧跟蹤信息。堆棧跟蹤顯示了異常發(fā)生時(shí)代碼的調(diào)用層次結(jié)構(gòu)。try{//可能會(huì)引發(fā)異常的代碼}catch(Exceptionex){stringstackTrace=ex.StackTrace;}9.4.2異常類(lèi)屬性③Source:Source屬性表示引發(fā)異常的應(yīng)用程序或?qū)ο蟮拿Q(chēng)。try{//可能會(huì)引發(fā)異常的代碼}catch(Exceptionex){stringsource=ex.Source;}④TargetSite:TargetSite屬性返回引發(fā)異常的方法或成員的MethodBase對(duì)象。try{//可能會(huì)引發(fā)異常的代碼}catch(Exceptionex){System.Reflection.MethodBasetargetMethod=ex.TargetSite;}9.4.2異常類(lèi)屬性⑤InnerException:InnerException屬性用于獲取引發(fā)當(dāng)前異常的內(nèi)部異常。如果異常嵌套,內(nèi)部異常會(huì)導(dǎo)致外部異常。try{//可能會(huì)引發(fā)異常的代碼}catch(Exceptionex){ExceptioninnerEx=ex.InnerException;}⑥HelpLink:HelpLink屬性表示與異常相關(guān)的幫助文件鏈接。try{//可能會(huì)引發(fā)異常的代碼}catch(Exceptionex){stringhelpLink=ex.HelpLink;}9.4.3異常處理語(yǔ)句(1)捕獲異常語(yǔ)句為了處理異常,可以使用try-catch語(yǔ)句塊來(lái)捕獲并處理異常,或者使用try-finally語(yǔ)句塊來(lái)確保資源的釋放,無(wú)論是否發(fā)生異常。處理異??梢詭椭绦蚋咏?,避免不必要的崩潰,并提供有用的錯(cuò)誤信息以供排查和修復(fù)。異常捕獲通常使用try-catch語(yǔ)句,其語(yǔ)法格式如下:try{//可能引發(fā)異常的代碼}catch(ExceptionType1ex1){//處理異常類(lèi)型1}catch(ExceptionType2ex2){//處理異常類(lèi)型2}finally{//無(wú)論是否發(fā)生異常,都會(huì)執(zhí)行的代碼塊}9.4.3異常處理語(yǔ)句在C#中,異常實(shí)例是由異常類(lèi)的構(gòu)造函數(shù)創(chuàng)建的對(duì)象,用于表示在程序執(zhí)行期間發(fā)生的異常情況。當(dāng)異常發(fā)生時(shí),可以創(chuàng)建一個(gè)異常實(shí)例并將其拋出,以便在代碼的其他地方捕獲和處理異常,以下是創(chuàng)建和拋出異常實(shí)例的示例:usingSystem;classProgram{staticvoidMain(){try{intresult=DivideByTwo(10);Console.WriteLine($"Result:{result}");}catch(DivideByZeroException){Console.WriteLine("Cannotdividebyzero.");
}catch(Exceptionex){Console.WriteLine($"Anerroroccurred:{ex.Message}");}}staticintDivideByTwo(intvalue){returnvalue/2;}}在這個(gè)示例中,當(dāng)傳遞給DivideByTwo方法的參數(shù)為0時(shí),將引發(fā)DivideByZeroException異常。9.4.3異常處理語(yǔ)句(2)拋出異常語(yǔ)句throw是C#中用于顯式引發(fā)異常的關(guān)鍵字。它允許你在代碼中主動(dòng)觸發(fā)異常,從而通知程序在某個(gè)地方發(fā)生了不正常的情況。通過(guò)使用throw關(guān)鍵字,你可以自定義異常,也可以在特定條件下引發(fā)已有的異常類(lèi)的實(shí)例。以下是throw關(guān)鍵字的用法示例:
try{intresult=Divide(10,0);//嘗試除以零}catch(DivideByZeroExceptionex){Console.WriteLine("CaughtDivideByZeroException!");Console.WriteLine($"Message:{ex.Message}");}①引發(fā)已有異常:staticintDivide(intdividend,intdivisor){if(divisor==0){thrownewDivideByZeroException("Divisorcannotbezero.");}returndividend/divisor;}9.4.3異常處理語(yǔ)句②引發(fā)自定義異
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年智能焊接生產(chǎn)線項(xiàng)目立項(xiàng)申請(qǐng)報(bào)告范文
- 2025春季中國(guó)太平校園招聘模擬試卷及答案詳解(名師系列)
- 2025年科研項(xiàng)目規(guī)劃申請(qǐng)報(bào)告
- 安全防范工作提升承諾書(shū)7篇
- 2025福建漳州市漳浦安然招聘2人模擬試卷及完整答案詳解1套
- 經(jīng)濟(jì)可持續(xù)發(fā)展目標(biāo)推進(jìn)承諾函5篇
- 2025年湖南師范大學(xué)第一批專(zhuān)任教師招聘96人考前自測(cè)高頻考點(diǎn)模擬試題有完整答案詳解
- 2025年福建省中共莆田市城廂區(qū)委社會(huì)工作部招聘4人考前自測(cè)高頻考點(diǎn)模擬試題及答案詳解參考
- 房地產(chǎn)團(tuán)購(gòu)合同
- 2025安徽蕪湖宜居投資(集團(tuán))有限公司子公司人員招聘10人考前自測(cè)高頻考點(diǎn)模擬試題及答案詳解(典優(yōu))
- 耗材緊急配送方案(3篇)
- 【格物致勝】2025年中國(guó)離散自動(dòng)化(FA)市場(chǎng)白皮書(shū)
- (新版)汽車(chē)維修檢驗(yàn)工(高級(jí))技能鑒定考試題庫(kù)(含答案)
- 建設(shè)工程工程量清單計(jì)價(jià)標(biāo)準(zhǔn)(2024版)
- 鼠疫霍亂防治指南課件
- 手外傷康復(fù)護(hù)理課件
- 電氣設(shè)備調(diào)試定額
- 醫(yī)院保密教育培訓(xùn)課件
- 自助終端機(jī)設(shè)備管理制度
- 寫(xiě)字樓公司門(mén)禁管理制度
- 實(shí)驗(yàn)室風(fēng)險(xiǎn)評(píng)估報(bào)告(金壇區(qū)疾控中心)
評(píng)論
0/150
提交評(píng)論