1. 程式人生 > >C#中的異常捕獲機制(try catch finally)

C#中的異常捕獲機制(try catch finally)

一、C#的異常處理所用到關鍵字  
try 用於檢查發生的異常,並幫助傳送任何可能的異常。  
catch 以控制權更大的方式處理錯誤,可以有多個catch子句。  
finally 無論是否引發了異常,finally的程式碼塊都將被執行。  
throw 用於引發異常,可引發預定義異常和自定義異常。  
  
二、C#異常處理的格式  
try  
{  
程式程式碼塊;  
}  
catch(Exception e)  
{  
異常處理程式碼塊;  
}  
finally  
{  
無論是否發生異常,均要執行的程式碼塊;  
}  
  
三、異常處理實戰  
一個除數和零的簡單例子:  
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)這一行將不會被執行。  
}  
catch  
{  
System.Console.WriteLine("傳遞過來的異常值為:{0}",e);  
}  
finally  
{  
System.Console.WriteLine("無論是否發生異常,我都會顯示。");  
}  
}  
}  
注:(1)行被執行則會丟擲一個異常,如果沒有catch語句,程式會異常終止,使用不帶引數的catch子句,則可以捕獲任意型別的異常。  
如果將(1)行註釋掉,啟用(2)行,這意味該程式執行時不會出現異常,從輸出可知,finally程式碼塊仍將被執行。  
  
可以給try語句提供多個catch語句,以捕獲特定的異常,如上例中:0作為除數則會引發DivideByZeroException型別的異常,上例中的catch語句可以作如下修改:  
catch(DivideByZeroException e)  
{  
System.Console.WriteLine("零不能作為除數!異常值為:\n{0}",e);  
}  
catch(Exception e)  
{  
System.Console.WriteLine("並非\''零作為除數引發的異常\"!異常值為:\n{0}",e);  
}  
  
為什麼還要加上一個catch(Exception e)子句呢?原因很簡單,catch(DivideByZeroException e)子句只能捕獲特定的異常,try內的程式程式碼可能還會產生其它的異常,這些異常只能由catch(Exception e)來捕獲了。  
  
下表給出了一些常見的異常:  
  
System名稱空間中常用的異常類  
  
異常類名稱 簡單描述  
  
MemberAccessException 訪問錯誤:型別成員不能被訪問  
  
ArgumentException 引數錯誤:方法的引數無效  
  
ArgumentNullException 引數為空:給方法傳遞一個不可接受的空引數  
  
ArithmeticException 數學計算錯誤:由於數學運算導致的異常,覆蓋面廣。  
  
ArrayTypeMismatchException 陣列型別不匹配  
  
DivideByZeroException 被零除  
  
FormatException 引數的格式不正確  
  
IndexOutOfRangeException 索引超出範圍,小於0或比最後一個元素的索引還大  
  
InvalidCastException 非法強制轉換,在顯式轉換失敗時引發  
  
MulticastNotSupportedException 不支援的組播:組合兩個非空委派失敗時引發  
  
NotSupportedException 呼叫的方法在類中沒有實現  
  
NullReferenceException 引用空引用物件時引發  
  
OutOfMemoryException 無法為新語句分配記憶體時引發,記憶體不足  
  
OverflowException 溢位  
  
StackOverflowException 棧溢位  
  
TypeInitializationException 錯誤的初始化型別:靜態建構函式有問題時引發  
  
NotFiniteNumberException 無限大的值:數字不合法  
  
四、定義自己的異常類  
  
除了預定義的異常外,我們還可以建立自己的異常,過程比較簡單:  
  
一宣告一個異常,格式如下:  
  
class ExceptionName:Exception{}  
  
二引發自己的異常:  
  
throw(ExceptionName);  
  
看一個例子:  
class IAmSecondGrade:System.Exception{}//宣告異常  
  
class SecondGrade  
{  
public static int mul(int first,int second)  
{  
if(first>100||second>100)  
throw new IAmSecondGrade();//引發異常  
return (first*second);  
}  
  
public static void Main()  
{  
int mul_value;  
  
try  
{  
mul_value=mul(99,56);  
System.Console.WriteLine("99與56積為:{0}",mul_value);  
mul_value=mul(101,4);  
System.Console.WriteLine("出現異常,這行是不會被執行的。");  
}  
catch(IAmSecondGrade)//捕獲自定義的異常  
{  
System.Console.WriteLine("我才上二年級,超過100的乘法我不會。嘿嘿,我自定義的異常。");  
}  
catch(System.Exception e)  
{  
System.Console.WriteLine("非自定義異常。其值為:{0}",e);  
}  
}  
}