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

來源:互聯網
上載者:User

標籤:style   blog   io   color   ar   使用   sp   for   strong   

一、C#的異常處理所用到關鍵字

     try :用於檢查發生的異常,並協助發送任何可能的異常。


     catch :以控制權更大的方式處理錯誤,可以有多個catch子句。


     finally: 無論是否引發了異常,finally的代碼塊都將被執行。


     throw: 用於引發異常,可引發預定義異常和自訂異常。

二、C#異常處理的格式
 1    try 2      { 3            //程式碼塊; 4     } 5 catch(Exception e) 6    { 7         //異常處理代碼塊; 8    } 9  finally10  {11      //無論是否發生異常,均要執行的代碼塊;12  }

 

三、異常處理實戰

一個除數和零的簡單例子:

 1 public class DivisorIsZero 2 { 3      private static void Main() 4 { 5 int dividend=10; 6 int divisor1=0; 7 int divisor2=5; 8 int DivideValue; 9 10 try11 {12     DivideValue=dividend/divisor1; //(1)13     //DivideValue=dividend/divisor2; //(2)14     System.Console.WriteLine("DivideValue={0}",DivideValue);//(3)這一行將不會被執行。15 }16 catch17 {18      System.Console.WriteLine("傳遞過來的異常值為:{0}",e);19 }20 finally21 {22         System.Console.WriteLine("無論是否發生異常,我都會顯示。");23 }24 }25 }

 

註:(1)行被執行則會拋出一個異常,如果沒有catch語句,程式會異常終止,使用不帶參數的catch子句,則可以捕獲任意類型的異常。
如果將(1)行注釋掉,啟用(2)行,這意味該程式運行時不會出現異常,從輸出可知,finally代碼塊仍將被執行。

可以給try語句提供多個catch語句,以捕獲特定的異常,如上例中:0作為除數則會引發DivideByZeroException類型的異常,上例中的catch語句可以作如下修改:

1 catch(DivideByZeroException e)2 {3      System.Console.WriteLine("零不能作為除數!異常值為:\n{0}",e);4 }5 catch(Exception e)6 {7     System.Console.WriteLine("並非\‘‘零作為除數引發的異常\"!異常值為:\n{0}",e);8 }

 

為什麼還要加上一個catch(Exception e)子句呢?原因很簡單,catch(DivideByZeroException e)子句只能捕獲特定的異常,try內的程式碼可能還會產生其它的異常,這些異常只能由catch(Exception e)來捕獲了。

下表給出了一些常見的異常:

System名稱空間中常用的異常類

異常類名稱 簡單描述

MemberAccessException 訪問錯誤:類型成員不能被訪問

ArgumentException 參數錯誤:方法的參數無效

ArgumentNullException 參數為空白:給方法傳遞一個不可接受的空參數

ArithmeticException 數學計算錯誤:由於數學運算導致的異常,覆蓋面廣。

ArrayTypeMismatchException 數群組類型不匹配

DivideByZeroException 被零除

FormatException 參數的格式不正確

IndexOutOfRangeException 索引超出範圍,小於0或比最後一個元素的索引還大

InvalidCastException 非法強制轉換,在顯式轉換失敗時引發

MulticastNotSupportedException 不支援的組播:組合兩個非空委派失敗時引發

NotSupportedException 調用的方法在類中沒有實現

NullReferenceException 引用Null 參考對象時引發

OutOfMemoryException 無法為新語句分配記憶體時引發,記憶體不足

OverflowException 溢出

StackOverflowException 棧溢出

TypeInitializationException 錯誤的初始化類型:靜態建構函式有問題時引發

NotFiniteNumberException 無限大的值:數字不合法

四、定義自己的異常類

除了預定義的異常外,我們還可以建立自己的異常,過程比較簡單:

一聲明一個異常,格式如下:

class ExceptionName:Exception{}

二引發自己的異常:

throw(ExceptionName);

看一個例子:

 1 class IAmSecondGrade:System.Exception{}//聲明異常 2  3 class SecondGrade 4 { 5 public static int mul(int first,int second) 6 { 7 if(first>100||second>100) 8 throw new IAmSecondGrade();//引發異常 9 return (first*second);10 }11 12 public static void Main()13 {14 int mul_value;15 16 try17 {18     mul_value=mul(99,56);19     System.Console.WriteLine("99與56積為:{0}",mul_value);20     mul_value=mul(101,4);21     System.Console.WriteLine("出現異常,這行是不會被執行的。");22 }23 catch(IAmSecondGrade)//捕獲自訂的異常24 {25     System.Console.WriteLine("我才上二年級,超過100的乘法我不會。嘿嘿,我自訂的異常。");26 }27 catch(System.Exception e)28 {29     System.Console.WriteLine("非自訂異常。其值為:{0}",e);30 }31 }32 }

 

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.