CNET異常處理與預(yù)處理_第1頁
CNET異常處理與預(yù)處理_第2頁
CNET異常處理與預(yù)處理_第3頁
CNET異常處理與預(yù)處理_第4頁
CNET異常處理與預(yù)處理_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、一、異常處理 一般而言,所謂“異常”是指:程序在運行時發(fā)生的不正常的錯誤情況。而當(dāng)異常狀況產(chǎn)生時,若能通過捕捉這些異常情況來加以處理,便能在程序執(zhí)行時避免錯誤的產(chǎn)生,從而避免陷入無法順利運行程序的窘境。<一> Exception異常類 Exception類表示在應(yīng)用程序執(zhí)行期間發(fā)生的錯誤。System.Exception類是所有異常的基類型。此類具有一些所有異常共享的值得注意的屬性:屬性訪問權(quán)限類型描述HelpLink只讀String獲取或設(shè)置指向此異常所關(guān)聯(lián)幫助文件的鏈接InnerException只讀Exception獲取或?qū)е庐?dāng)前異常的Exception實例Message只讀

2、String獲取描述當(dāng)前異常的消息Source只讀String獲取或設(shè)置導(dǎo)致錯誤的應(yīng)用程序或?qū)ο蟮拿QStackTrace只讀String獲取當(dāng)前異常發(fā)生所經(jīng)歷的方法的名稱和簽名TargetSite只讀MethodBase獲取引入當(dāng)前異常的方法 Exception類是所有異常的基類。當(dāng)發(fā)生錯誤時,系統(tǒng)或當(dāng)前正在執(zhí)行的應(yīng)用程序通過引發(fā)包含關(guān)于該錯誤的信息的異常來報告錯誤。異常發(fā)生后,將由該應(yīng)用程序或缺少異常處理程序進行處理。 異常類型支持下面的功能: 描述錯誤的可讀文本。當(dāng)異常發(fā)生時,運行庫產(chǎn)生文本消息,通知用戶錯誤的改選并提供解決該問題的操作建議。此文本消息保存在異常對象的Message屬性中

3、,在創(chuàng)建異常對象過程中,可以將文本字符串傳遞給構(gòu)造函數(shù)以描述該特定異常的詳細信息。如果沒有向構(gòu)造函數(shù)提供錯誤信息參數(shù),則將使用缺省錯誤信息。 發(fā)生異常時調(diào)用堆棧的狀態(tài)。StackTrace屬性包含可以用來確定代碼中錯誤發(fā)生位置的堆棧跟蹤。堆棧跟蹤列出所有調(diào)用的方法和源文件中這些調(diào)用所在的行號。 基類Exception存在兩類異常 從SystemException派生的預(yù)定義公共語言運行庫異常類。 從ApplicationException派生的用戶定義的應(yīng)用程序異常類。1、異常層次結(jié)構(gòu) 有兩種類型的異常:由執(zhí)行程序生成的異常和由公共語言運行庫生成的異常。另外,還有由應(yīng)用程序或運行庫引發(fā)的異常的

4、層次結(jié)構(gòu)。 Exception是異常的基類。若干異常類直接從Exception繼承,其中包括ApplicationException和SystemException。這兩個類構(gòu)成幾乎所有運行庫異常的基礎(chǔ)。錯誤發(fā)生時,運行庫引發(fā)SystemException的適當(dāng)派生類。這些錯誤是失敗的運行庫檢查(如數(shù)組走出界限錯誤)導(dǎo)致的,它們可在任何方法的執(zhí)行過程中發(fā)生。ApplicationException由用戶程序引發(fā),而不是由運行庫引發(fā)。如果設(shè)計創(chuàng)建新異常的應(yīng)用程序,應(yīng)從ApplicationException類派生那些異常。不建議捕捉SystemException,在應(yīng)用程序中引發(fā)SystemEx

5、ception也不是好的編程做法。 最嚴(yán)重的異常,即那些由運行庫引發(fā)或在不可恢復(fù)的情況中引發(fā)的異常包括ExecutionEngineException、StackOverflowException和OutOfMemoryException。交互操作異常從SystemException派生并由ExternalException進一步擴展。例如,COMException是COM Interop操作過程中引發(fā)的異常,它從ExternalException派生。Win32Exception和SEHException也從ExternalException派生。2、運行庫異常層次結(jié)構(gòu) 運行庫有一組Syst

6、emException派生的基異常,它在執(zhí)行各指令時引發(fā)這些異常。下表是運行庫提供的標(biāo)準(zhǔn)異常以及派生類的創(chuàng)建條件異常類型基類型說明示例ExceptionObject所有異常的基類無(使用此異常的派生類)SystemExceptionException所有運行時生成的錯誤的基類無(使用此異常的派生類)IndexOutOfRangeExceptionSystemException僅當(dāng)錯誤地對數(shù)據(jù)進行索引時,才由運行庫引發(fā)在數(shù)組的有效范圍外對數(shù)組進行索引:arrarr.length+1NullReferenceExceptionSystemException僅當(dāng)引用空對象時,才由運行庫引發(fā)Objec

7、t 0=null;o.ToString();InvalidOperationExceptionSystemException當(dāng)處于無效狀態(tài)時,由方法引發(fā)從基礎(chǔ)集合移除Item后調(diào)用Enumerator.GetNext()ArgumentExceptionSystemException所有參數(shù)異常的基類無(使用此異常的派生類)ArgumentNullExceptionArgumentException由不允許參數(shù)為空的方法引發(fā)String s=null;“Calculate”.IndexOf(s);ArgumentOutOfRangeExceptionArgumentException由難參數(shù)是

8、否位于給定范圍內(nèi)的方法引發(fā)String s=”string”;s.Chars9;ExternalExceptionSystemException在運行庫的外部環(huán)境中發(fā)生或針對這類環(huán)境的異常的基類無(使用此異常的派生類)COMExceptionExternalException封裝COM HRESULT信息的異常在COM Interop中使用SEHExceptionExternalException封裝Win32結(jié)構(gòu)化異常處理信息的異常在非托管代碼interop中使用3、常用異常類下表是C#拋出的常用異常異類類描述System.OutOfMemoryException當(dāng)試圖通過new來分配內(nèi)存失

9、敗時拋出System.StackOverflowException當(dāng)執(zhí)行棧太多未完成的方法調(diào)用耗盡時拋出;典型情況為濃度、龐大的遞歸System.NullReferenceException當(dāng)null引用在造成引用的對象被需要的情況下使用時拋出System.TypeInitializationException當(dāng)一個表態(tài)構(gòu)造函數(shù)拋出一個異常,并且沒有任何catch語句來俘獲它的時候拋出System.ArrayTypeMismatchException當(dāng)因為存儲元素的實例類型與數(shù)組的實際類型不匹配而造成一個數(shù)組存儲失敗時拋出System.InvalidCastException當(dāng)一個從基本類型或

10、接口到一個派生類型的轉(zhuǎn)換在支持時失敗拋出System.IndexOutOfRangeException當(dāng)試圖通過一個比零小或者超出數(shù)組邊界的下標(biāo)來索引一個數(shù)組時會引發(fā)此異常System.MulticastNotSupportedException當(dāng)試圖合并兩個非空代表失敗時拋出;因數(shù)代表類型沒有void返回類型System.ArithmeticException一個異常的基類,在算術(shù)運算時發(fā)生,如DivideByZeroException和OverflowExceptionSystem.DivideByZeroException當(dāng)試圖用整數(shù)類型數(shù)據(jù)除以零時拋出System.OverflowEx

11、ception當(dāng)checked中的一個算術(shù)運算溢出時拋出System.ArithmerticException在算術(shù)運算期間發(fā)生的異常(如System.DivideByZeroException和System.OverflowException)的基類System.AccessException訪問一個類型成員(如一個方法或域)失敗System.ArgumentException方法參數(shù)非法BadImageFormatException圖像格式錯誤System.CoreException被運行期異常拋出基類FieldAccessException訪問一個域出錯FormatException參數(shù)

12、格式錯誤MethodAccessException無效的方法調(diào)用<二>異常處理 1、try、catch、finally語句 將有可能發(fā)生異常錯誤的代碼作為try語句塊(即把有可能出現(xiàn)錯誤的代碼放在try語句塊內(nèi));處理try語句中出現(xiàn)的異常代碼放到catch語句塊中;finally語句則是不管try語句中有沒有異常發(fā)生最后都要執(zhí)行finally語句中的程序塊。例:try-catch-finally語句示例。using System;using System.Collections;namespace 筆記 class WithFinally public static void M

13、Main() /有可能發(fā)生異常的語句放入到try語句中 try int x = 5; int y = 0; int z = x / y; /異常,除數(shù)為0 Console.WriteLine(z); /不再執(zhí)行 /try語句發(fā)生異常將跳轉(zhuǎn)到catch塊,由catch語句塊內(nèi)的程序處理異常 catch (DivideByZeroException) Console.WriteLine("Error occurred,unable to computer"); /不管有沒有異常發(fā)生,都將執(zhí)行finally語句塊中的代碼 finally Console.WriteLine(&qu

14、ot;Thank you for using the Program"); 程序運行結(jié)果:Error occurred,unable to computerThank you for using the Program 代碼有一個除以零的式子將引發(fā)DivideByZeroException異常。發(fā)生異常以后,try語句塊發(fā)生異常語句后面的代碼將不再執(zhí)行,而是尋找與此try語句相關(guān)聯(lián)的catch語句塊,并執(zhí)行其中的代碼。finally語句塊則不管上面有沒有異常發(fā)生都要執(zhí)行。try語句有三種形式:try-catch、try-catch-finally、try-finally。 通常情況下

15、要將可能發(fā)生異常的代碼放入到try語句塊中。一個try塊必須有至少一個與之相關(guān)聯(lián)的catch語句塊或finally語句塊,單獨一個try語句塊是沒有意義的。 catch語句塊中包含的是出現(xiàn)異常時要執(zhí)行的代碼。一個try后面可以有零個以上的catch語句塊。如果try語句塊中沒有異常,則catch語句塊中的代碼不會被執(zhí)行。catch后面括號放入希望捕獲的異常,如上例中DivideByZeroException異常。當(dāng)兩個catch語句的異常類有派生關(guān)系的時候,要將包括派生的異常類catch語句放到前面,包括基類的catch語句放置到后面。 finally語句塊包含了一定要執(zhí)行的代碼,通常是一些資

16、源釋放,關(guān)閉文件等代碼。多catch語句示例:using System;using System.Collections;namespace 筆記 class WithFinally public static void MMain() try int x = 5; int y = 0; int z = x / y; /異常,除數(shù)為0 Console.WriteLine(z); /不再執(zhí)行 catch (FormatException) Console.WriteLine("Error occurred,FormatException"); catch (DivideByZ

17、eroException) Console.WriteLine("Error occurred,DivideByZeroException"); catch Console.WriteLine("Error occurred,Exception"); finally Console.WriteLine("Thank you for using the program"); 程序運行結(jié)果:Error occurred,DivideByZeroExceptionThank you for using the program 第一個catc

18、h語句捕獲異常是FormatException,表示參數(shù)格式不正確導(dǎo)致的異常,第二個catch語句語句捕獲異常是DivideByZeroException,表示用整數(shù)類型數(shù)據(jù)除以零拋出異常,第三個catch語句捕獲異常是Exception,這是所有異常類的基類。最終執(zhí)行第二個catch語句。如果將第三個catch語句作為第一個catch語句,程序編譯不能通過,將提示:“前一個catch子句已經(jīng)捕獲該類型或超類類(“System.Exception”)的所有異常。”2、throw語句 異常的發(fā)生有兩種可能:代碼執(zhí)行過程中滿足了異常的條件而使程序無法正常運行下去;通過throw語句無條件拋出異常。

19、第一種情況上面已經(jīng)介紹過了。第二種情況則與第一種情況完全相反,通過throw語句主動在程序中拋出異常拋出的異常要用catch語句捕獲,否則程序運行將中斷。 throw語句用法: throw expression throw語句拋出的異常表達式expression必須表示一個System.Exception類型或它的派生類。也可以在throw語句后沒有expression表達式,表示將異常再次拋出。例:throw語句拋出異常。using System;using System.Collections;namespace 筆記 class ThrowExample public void Div(

20、) try int x = 5; int y = 0; int z = x / y; Console.WriteLine(z); catch (DivideByZeroException e) throw new ArithmeticException("被除數(shù)為零", e); /拋出另一個異常 public static void MMain() try ThrowExample ThrowException = new ThrowExample(); ThrowException.Div(); catch(Exception e) /捕獲throw拋出的異常 Conso

21、le.WriteLine("Exception:0", e.Message); /輸出描述異常的信息 程序運行結(jié)果:Exception:被除數(shù)為零 throw語句重新拋出一個新的異常ArithmeticException,然后由MMain()中的catch捕獲。例:throw語句異常再次拋出using System;using System.Collections;namespace 筆記 class ThrowExample public void Div() try int x = 5; int y = 0; int z = x / y; Console.WriteLi

22、ne(z); catch (DivideByZeroException) throw; public static void MMain() try ThrowExample ThrowException = new ThrowExample(); ThrowException.Div(); catch(DivideByZeroException e) /捕獲throw再次拋出的DivideByZeroException異常 Console.WriteLine("Exception:0", e.Message); /輸出描述異常的信息 程序運行結(jié)果:Exception:試圖

23、除以零。二、預(yù)處理器 預(yù)處理就是在編譯程序之前由程序處理器對源程序進行一些加工處理工作。C#的預(yù)處理類似于C+預(yù)處理,但是,與C+不同的是C#沒有獨立的預(yù)處理器,并不是編譯器開始編譯代碼之前的一個單獨的處理步驟,它是作為詞法分析的一部分來執(zhí)行的。預(yù)處理指令都是以#開頭,并且一行只能有一個預(yù)處理指令,指令結(jié)尾不需要用分號表示語句的結(jié)束。 預(yù)處理主要有以下幾類預(yù)處理指令: #define和#undef:用于定義和取消定義條件編譯符號。 #if,#elif,#else和endif:用于按條件跳過源代碼中的節(jié)。 #error和#warning:發(fā)出錯誤和警告提示。 #region和endregion:

24、顯式標(biāo)記代碼中的節(jié)。折疊代碼。 #line:控制發(fā)出錯誤和警告信息時提供的行號和源文件名稱。預(yù)處理指令一般書寫格式如下: 總是以字符#和預(yù)處理指令名稱開頭,占用源代碼中的單獨一行。#字符的前面以及#字符與指令名稱之間可以出現(xiàn)空白。 包含#define,#undef,#if,#elif,#else,#endif或line指令的源行可以用單行注釋結(jié)束。在包含預(yù)處理指令的源行上不允許使用帶分隔符的注釋(即/* */樣式注釋)。<一> #define、#undef指令 #define和#undef指令是用于定義符號和取消符號定義的預(yù)處理指令。格式如下: #define 符號 #undef

25、符號 這里定義和取消的符號是DEBUG。如果定義的符號已經(jīng)存在,#define則不起作用,同樣道理,如果符號不存在,#undef也就沒有任何作用。#define和#undef指令必須放于源程序的代碼之前。如: #define DEBUG using System; #define指令本身沒有什么用,但和其它預(yù)處理命令結(jié)合使用,特別是#if,功能將非常強大。<二> #if、#elif、#else、#endif指令 #if、#elif、#else、#endif指令被用作條件編譯,它們類似于if/else結(jié)構(gòu)。#if和#elif后的標(biāo)識符表達式可以使用運算符與(&&)、或

26、(|)、非(!)。它們在程序中結(jié)構(gòu)如下所示: 一條#if語句(必須有) 零或多條#elif語句 零或多一條#else語句 一條#endif語句(必須有)預(yù)處理示例:#define DEBUGusing System;using System.Collections;using System.Threading;namespace 筆記 public class MyClass public static void MMain() #if (DEBUG) Console.WriteLine("DEBUG is defined");#else Console.WriteLine

27、("DEBUG is not defined");#endif 當(dāng)執(zhí)行到#if語句時,首先檢查DEBUG是否已經(jīng)定義,如果符號定義,就編譯#if塊中的代碼,否則編譯#else塊中的代碼。 #elif指令相當(dāng)于“else if”。#elif指令示例:#define A#undef Busing System;using System.Collections;using System.Threading;namespace 筆記 public class MyClass public static void MMain() #if (A && !B) Console.WriteLine("A is defined");#elif(!A && B)

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論