C#異常處理機(jī)制初步講解
一、C#異常處理機(jī)制所用到關(guān)鍵字
try用于檢查發(fā)生的異常,并幫助發(fā)送任何可能的異常。
catch以控制權(quán)更大的方式處理錯誤,可以有多個catch子句。
finally無論是否引發(fā)了異常,finally的代碼塊都將被執(zhí)行。
throw用于引發(fā)異常,可引發(fā)預(yù)定義異常和自定義異常。
二、C#異常處理機(jī)制的格式
try { 程序代碼塊; } catch(Exception e) { 異常處理代碼塊; } finally { 無論是否發(fā)生異常,均要執(zhí)行的代碼塊; }
三、C#異常處理機(jī)制實戰(zhàn)
一個除數(shù)和零的簡單例子:
注:(1)行被執(zhí)行則會拋出一個異常,如果沒有catch語句,程序會異常終止,使用不帶參數(shù)的catch子句,則可以捕獲任意類型的異常。public class DivisorIsZero { private static void Main() { int dividend= 10; int divisor1= 0; int divisor2= 5; int DivideValue; try { DivideValue= dividend/divisor1; //(1) // DivideValue= dividend/divisor2; //(2) System.Console.WriteLine(" DivideValue={0}",DivideValue);//(3)這一行將不會被執(zhí)行。 } catch { System.Console.WriteLine("傳遞過來的異常值為:{0}",e); } finally { System.Console.WriteLine("無論是否發(fā)生異常,我都會顯示。"); } } }
如果將(1)行注釋掉,啟用(2)行,這意味該程序運行時不會出現(xiàn)異常,從輸出可知,finally代碼塊仍將被執(zhí)行。
可以給try語句提供多個catch語句,以捕獲特定的異常,如上例中:0作為除數(shù)則會引發(fā)DivideByZeroException類型的異常,上例中的catch語句可以作如下修改:
為什么還要加上一個catch(Exceptione)子句呢?原因很簡單,catch(DivideByZeroExceptione)子句只能捕獲特定的異常,try內(nèi)的程序代碼可能還會產(chǎn)生其它的異常,這些異常只能由catch(Exceptione)來捕獲了。catch(DivideByZeroException e) { System.Console.WriteLine("零不能作為除數(shù)!異常值為:\n{0}",e); } catch(Exception e) { System.Console.WriteLine("并非\''零作為除數(shù)引發(fā)的異常\"!異常值為:\n{0}",e); }
下表給出了一些常見的異常:
System名稱空間中常用的異常類
異常類名稱簡單描述
MemberAccessException訪問錯誤:類型成員不能被訪問
ArgumentException參數(shù)錯誤:方法的參數(shù)無效
ArgumentNullException參數(shù)為空:給方法傳遞一個不可接受的空參數(shù)
ArithmeticException數(shù)學(xué)計算錯誤:由于數(shù)學(xué)運算導(dǎo)致的異常,覆蓋面廣。
ArrayTypeMismatchException數(shù)組類型不匹配
DivideByZeroException被零除
FormatException參數(shù)的格式不正確
IndexOutOfRangeException索引超出范圍,小于0或比***一個元素的索引還大
InvalidCastException非法強(qiáng)制轉(zhuǎn)換,在顯式轉(zhuǎn)換失敗時引發(fā)
MulticastNotSupportedException不支持的組播:組合兩個非空委派失敗時引發(fā)
NotSupportedException調(diào)用的方法在類中沒有實現(xiàn)
NullReferenceException引用空引用對象時引發(fā)
OutOfMemoryException無法為新語句分配內(nèi)存時引發(fā),內(nèi)存不足
OverflowException溢出
StackOverflowException棧溢出
TypeInitializationException錯誤的初始化類型:靜態(tài)構(gòu)造函數(shù)有問題時引發(fā)
NotFiniteNumberException無限大的值:數(shù)字不合法
四、定義自己的異常類
除了預(yù)定義的異常外,我們還可以創(chuàng)建自己的異常,過程比較簡單:
㈠聲明一個異常,格式如下:
classExceptionName:Exception{}
㈡引發(fā)自己的異常:
throw(ExceptionName);
看一個例子:
今天學(xué)習(xí)了一些異常處理的重要特性,還有許多其它的特性,有待以后努力class IAmSecondGrade:System.Exception{}//聲明異常 class SecondGrade { public static int mul(int first,int second) { if(first > 100||second> 100)throw new IAmSecondGrade();//引發(fā)異常 return (first*second); } public static void Main() { int mul_value; try { mul mul_value=mul(99,56); System.Console.WriteLine("99與56積為:{0}",mul_value); mul mul_value=mul(101,4); System.Console.WriteLine("出現(xiàn)異常,這行是不會被執(zhí)行的。"); } catch(IAmSecondGrade)//捕獲自定義的異常 { System.Console.WriteLine("我才上二年級,超過100的乘法我不會。嘿嘿,我自定義的異常。"); } catch(System.Exception e) { System.Console.WriteLine("非自定義異常。其值為:{0}",e); } } }
【編輯推薦】