版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第7章 程序的生成、異常處理和調(diào)試 7.1 異常處理7.1.1 異常類7.1.2 try-catch7.1.3 try-catch-finally7.1.4 多重try結(jié)構(gòu)7.1.5 默認(rèn)異常處理7.1.6 throw7.1.7 用戶自定義異常7.2 Visual Studio 2017的調(diào)試功能目 錄7.1.1 異常類 專業(yè)的程序必須能夠處理異常情況。在.NET以前的編程語言中,這常常稱作錯誤處理。意外的情況會生成錯誤代碼,程序捕捉這段代碼并采取相應(yīng)的措施。 .NET的公共語言運行庫并不產(chǎn)生錯誤代碼。在出現(xiàn)異常情況時,CLR創(chuàng)建一個稱作異常的特殊對象,該對象中的屬性和方法詳細(xì)描述了異常情況以
2、及引起錯誤的具體原因。 .NET處理的是異常而不是錯誤,因此在.NET中不再使用術(shù)語“錯誤處理”,改用“異常處理”。異常處理指的是發(fā)現(xiàn)異常時采取相應(yīng)措施的.NET技術(shù)。 .NET實現(xiàn)了系統(tǒng)范圍內(nèi)功能強(qiáng)大的錯誤處理方式,.NET中不再使用錯誤符號,而使用異常對象。異常對象是一個包含錯誤相關(guān)信息的對象,這些信息顯示為該對象的屬性。異常對象是派生于System.Exception類的一個實例,System.Exception類有許多子類用于不同的異常情況。7.1 異常處理7.1.1 異常類 在C#語言中使用異常類和異常處理需要用到幾個關(guān)鍵字,它們是: try:開始一段可能出現(xiàn)錯誤的代碼。這段代碼常常
3、稱為 try塊。 catch:為一種類型的異常開始一個錯誤處理程序。catch跟在try塊的后面,try結(jié)構(gòu)可以有多個catch塊,每個catch塊都捕獲不同類型的異常。在try塊中遇到錯誤時,開始執(zhí)行第一個與異常類型匹配的catch塊。 finally:包含在try塊正常結(jié)束時執(zhí)行的代碼,或者catch塊執(zhí)行完畢后執(zhí)行的代碼。也就是說,無論是否檢測到異常,finally塊中的代碼總是會執(zhí)行。finally塊一般用于關(guān)閉或刪除資源,例如數(shù)據(jù)庫連接,如果沒有清理這類資源,代碼就會出問題。 throw:生成一個錯誤,在catch塊中可以用它把異常送回給調(diào)用例程,如果某個例程檢測到傳入?yún)?shù)類型錯誤,
4、也可以用它拋出異常。7.1 異常處理7.1.2 try-catch try-catch 語句由一個 try 塊后跟一個或多個 catch 子句構(gòu)成,這些子句指定不同的異常處理程序。引發(fā)異常時,公共語言運行時 (CLR) 會查找處理此異常的 catch 語句。如果當(dāng)前執(zhí)行的方法不包含這樣的 catch 塊,則 CLR 會查看調(diào)用當(dāng)前方法的方法,然后會遍歷調(diào)用堆棧。如果找不到 catch 塊,則 CLR 會向用戶顯示一條有關(guān)未處理異常的消息并停止執(zhí)行程序。7.1 異常處理7.1.2 try-catch 雖然可以使用不帶參數(shù)的 catch 子句捕捉任何類型的異常,但不推薦這種用法。通常,應(yīng)該只捕捉那
5、些知道如何從中恢復(fù)的異常。因此,應(yīng)該總是指定一個從 System.Exception 派生的對象參數(shù)。例如:catch (InvalidCastException e) 7.1 異常處理7.1.2 try-catch 在同一個 try-catch 語句中可以使用一個以上的特定 catch 子句。這種情況下 catch 子句的順序很重要,因為會按順序檢查 catch 子句。將先捕獲特定程度較高的異常,而不是特定程度較小的異常。如果對 catch 塊進(jìn)行排序以使永遠(yuǎn)不能達(dá)到后面的塊,編譯器將產(chǎn)生錯誤。例7-27.1 異常處理7.1.2 try-catch在 catch 塊中可以使用 throw 語
6、句再次引發(fā)已由 catch 語句捕獲的異常。例如:catch (InvalidCastException e) throw (e); / 再次引發(fā)已由 catch 語句捕獲的異常同時也可以引發(fā)新的異常。下面的例子中將捕捉的異常指定為內(nèi)部異常:catch (InvalidCastException e) / 引發(fā)自定義的新異常 throw new CustomException(Error message here., e);如果要再次引發(fā)當(dāng)前由無參數(shù)的 catch 子句處理的異常,則使用不帶參數(shù)的 throw 語句。例如:catch throw;7.1 異常處理7.1.2 try-catch
7、在 try 塊內(nèi)部時應(yīng)該只初始化其中聲明的變量;否則,完成該塊的執(zhí)行前可能發(fā)生異常。例如,在下面的代碼示例中,變量 x 在 try 塊內(nèi)初始化。試圖在 Write(x) 語句中的 try 塊外部使用此變量時將產(chǎn)生編譯器錯誤:使用了未賦值的局部變量。 7.1 異常處理7.1.2 try-catchstatic void Main() int x; try / 不能在此處初始化聲明的變量 x = 123; catch /此處可能會引發(fā)異常:使用了未賦值的局部變量 Console.Write(x); 7.1 異常處理7.1.3 try-catch-finally finally 塊用于清除 try
8、塊中分配的任何資源,以及運行任何即使在發(fā)生異常時也必須執(zhí)行的代碼。控制總是傳遞給 finally 塊,與 try 塊的退出方式無關(guān)。 catch 用于處理語句塊中出現(xiàn)的異常,而 finally 用于保證代碼語句塊的執(zhí)行,與前面的 try 塊的退出方式無關(guān)。 finally 塊中的語句不管異常是否觸發(fā)都會被執(zhí)行。 catch 和 finally 一起使用的常見方式是:在 try 塊中獲取并使用資源,在 catch 塊中處理異常情況,并在 finally 塊中釋放資源。 7.1 異常處理7.1.3 try-catch-finally 例7-3演示了一個典型的使用try-catch-finally結(jié)
9、構(gòu)的情景,在try塊中占用了一個對文件object類型的變量o拆箱并引發(fā)一個IOException異常,在catch塊中對異常進(jìn)行捕獲但不做任何處理,在finally塊中輸出i。finally塊保證了不管程序運行過程中是否產(chǎn)生異常都能正確釋放程序運行時所占用的系統(tǒng)資源。 7.1 異常處理7.1.4 多重try結(jié)構(gòu)所謂多重try結(jié)構(gòu)就是指一個try塊可以嵌套在另一個try 塊中。在內(nèi)部try塊中生成但沒有被與該try關(guān)聯(lián)的catch捕獲的異常會傳播到外部try塊中。 7.1 異常處理7.1.4 多重try結(jié)構(gòu) 在例7-4中,可以被內(nèi)部try處理的異常(在本例中是除以零錯誤)允許程序繼續(xù)執(zhí)行。然而
10、,數(shù)組邊界錯誤被外部try捕獲,從而導(dǎo)致程序終止。雖然這不是使用多重try結(jié)構(gòu)的唯一原因,但是從前面的程序可以概括出下面的要點:多重try結(jié)構(gòu)經(jīng)常用來以不同的方式處理不同類型的錯誤。有些錯誤的類型是災(zāi)難性的,不能修復(fù)。有些則不太重要,可以立即處理。很多程序員使用外部try塊來捕獲最嚴(yán)重的錯誤,允許內(nèi)部try塊處理不太嚴(yán)重的錯誤。也可以使用外部try塊作為“捕獲所有異常”的塊,以此來捕獲內(nèi)部try塊沒有處理的錯誤。 7.1 異常處理7.1.5 默認(rèn)異常處理 有時引發(fā)了一個異常后,代碼中沒有catch塊能處理這類異常。例如,假定忽略FormatException和通用的catch塊,只有處理Ind
11、exOutOfRangeException的塊。此時,如果引發(fā)一個FormatException異常,會發(fā)生什么情況呢? 答案是.NET運行庫會捕獲它。.NET運行庫可以把整個程序放在另一個更大的try快中,每個.NET程序都會這么做。這個try塊有一個catch處理程序,它可以捕獲任何類型的異常。如果代碼沒有處理發(fā)生的異常,程序流就會退出程序。由.NET運行庫中的catch塊捕獲它。但是,結(jié)果并不是你想像的那樣。代碼的執(zhí)行會即時中斷,并給用戶顯示一個對話框,通知用戶代碼沒有處理異常,并給出.NET運行庫能檢索到的異常信息。7.1 異常處理7.1.6 throw throw 語句用于發(fā)出在程序
12、執(zhí)行期間出現(xiàn)反常情況(異常)的信號。引發(fā)的異常是一個對象,該對象的類是從 System. Exception 派生的,例如:class MyException : System.Exception / .throw new MyException(); 通常 throw 語句與 try-catch 或 try-finally 語句一起使用,throw 語句也可以用于重新引發(fā)已捕獲的異常。 在例7-5中,當(dāng)索引超過數(shù)組長度時,通過throw拋出了一個IndexOutOfRangeException異常實例。7.1 異常處理7.1.7 用戶自定義異常一般情況下,我們使用系統(tǒng)內(nèi)部提供的異常就足夠了,
13、但是有時為了特殊的目的,必須使用用戶自定義異常。 無論我們使用的是系統(tǒng)自定義異常,還是用戶自定義異常,它們都具有相同的異常處理機(jī)制,都包括定義異常類、拋出異常對象和捕獲并處理異常三部分,只不過是前兩個過程已經(jīng)在.NET框架中定義好了。 異常類本身和一般的類的定義沒有任何區(qū)別,但是由于使用throw關(guān)鍵字和catch關(guān)鍵字所拋出和捕獲的異常對象必須是Exception類或者Exception類子類的子類對象,因此所有用戶自定義的異常類必須由Exception類或者Exception類的子類派生。7.1 異常處理7.1.7 用戶自定義異常 由于異常屬于意外事件,并不是總是發(fā)生,所以必須有一個條件判
14、斷語句if(滿足拋出異常條件);然后再拋出異常throw new Excrption,比如:if(y = 0)/如果被除數(shù)為零 /拋出DivideByZeroException異常類對象; throw new DivideByZeroException(); catch關(guān)鍵字用于捕獲在try程序塊中所引發(fā)的異常,根據(jù)該關(guān)鍵字所攜帶的參數(shù)列表的不同具有多種重載方式,但是所有的catch重載塊最多只有一個被執(zhí)行。比如:catch(DivideByZeroException dz)Console.WriteLine(dz.ToStirng();7.1 異常處理7.1.7 用戶自定義異常 例7-6中,
15、首先我們建立自己的C#異常類 CustomerException,它要繼承自Exception類,然后聲明一個帶參數(shù)構(gòu)造函數(shù),該構(gòu)造函數(shù)調(diào)用基類的帶參數(shù)構(gòu)造函數(shù)設(shè)置當(dāng)前異常的消息。在ThrowCustomException函數(shù)中,通過throw關(guān)鍵字人為拋出一個CustomerException異常。在Main函數(shù)中通過try語句塊調(diào)用ThrowCustomException函數(shù),這時就可以捕獲到用戶自定義的CustomerException異常,然后在catch語句塊中獲取異常實例,并在控制臺中輸出異常消息。7.1 異常處理 首先需要了解是斷點(breakpoint):一個對調(diào)試器的指令,可
16、以使調(diào)試器運行到應(yīng)用程序特定的某一行然后停止。設(shè)置斷點最簡單的方式是在應(yīng)用程序源代碼的某一特定行左邊點擊。斷點設(shè)置成功后,IDE會用一個紅點標(biāo)記斷點7.2 Visual Studio 2017的調(diào)試功能 如果要開始對代碼進(jìn)行調(diào)試可以選擇IDE菜單“調(diào)試開始調(diào)試”,或者按F5鍵。程序會編譯并運行到斷點,此時它會停下來,有一個黃色箭頭指向下一步要執(zhí)行的語句7.2 Visual Studio 2017的調(diào)試功能到達(dá)斷點后,查看各對象的值很容易。例如,可以把光標(biāo)放在變量上等一會兒,就能看到它的值7.2 Visual Studio 2017的調(diào)試功能調(diào)試器IDE還提供了許多有用的窗口,如“局部變量”窗口會顯示所有局部變量的值7.2 Visual Studio 2017的調(diào)試功能對象顯示的是類型及一個加號,可以打開它們看看內(nèi)部數(shù)據(jù)在調(diào)試狀態(tài)下,按F11鍵可以單步執(zhí)行到下
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024廣告征集代理合同范本
- 2024貨物運輸托運合同范文
- 短期流動資金借款合同
- 2024汽車公司運輸合同范本
- 2024年度工程分包合同條款詳細(xì)描述
- 出租車經(jīng)營權(quán)轉(zhuǎn)讓協(xié)議
- 技術(shù)合同在企業(yè)競爭力提升中的作用
- 2024公司房產(chǎn)土地轉(zhuǎn)讓合同
- 2024新版大學(xué)場地租賃合同(商業(yè)活動)
- 房地產(chǎn)項目轉(zhuǎn)讓協(xié)議書
- 小記者第一課我是一名小記者
- 團(tuán)結(jié)友愛和睦相處主題班會
- 2024年采購部年度工作總結(jié)
- 2024年總經(jīng)理聘任書
- 2024年江蘇省中等職業(yè)學(xué)校學(xué)生學(xué)業(yè)水平考試機(jī)械CAD繪圖評分表
- 期中 (試題) -2024-2025學(xué)年外研版(三起)英語六年級上冊
- 中小學(xué)教師職業(yè)道德規(guī)范(2023年修訂)全文1500字
- 2024年車路云一體化系統(tǒng)建設(shè)與應(yīng)用指南報告
- 2024年福建省托育服務(wù)職業(yè)技能競賽理論考試題庫(含答案)
- 2024下半年江蘇蘇州城市學(xué)院招聘管理崗位工作人員27人歷年(高頻重點提升專題訓(xùn)練)共500題附帶答案詳解
- 二年級乘除法口算題大全500題(可直接打印)
評論
0/150
提交評論