位置:首頁 > 高級語言 > C#教學 > C#異常處理

C#異常處理

異常是程序的執行期間產生的一個問題。 C#例外是一個特殊的情況,在程序運行時,比如嘗試除以零而引致的響應。

例外提供一種方法來從一個程序到另一個的部分轉移控製。 C#異常處理是建立在四個關鍵字:try, catch, finally 和 throw.

  • try: try塊標識代碼塊的哪些特定的異常將被激活。它的後麵是一個或多個catch塊。

  • catch: 程序捕獲異常,並在要處理的問題,程序異常處理的地方。美中不足的關鍵字表示異常的醒目。

  • finally: finally塊用來執行一組給定的語句,異常是否被拋出或不拋出。例如,如果打開一個文件時,它必須是封閉的異常是否引發。

  • throw: 一個程序拋出一個異常,當問題出現了。通過使用一個throw關鍵字。

語法

假設一個塊將引發異常,一個捕獲異常的方法使用try和catch關鍵字組合。一個try/ catch塊周圍放置可能產生異常的代碼。try / catch塊中的代碼被稱為保護代碼,使用try/ catch語句語法如下所示:

try
{
   // statements causing exception
}
catch( ExceptionName e1 )
{
   // error handling code
}
catch( ExceptionName e2 )
{
   // error handling code
}
catch( ExceptionName eN )
{
   // error handling code
}
finally
{
   // statements to be executed
}

可以列出來的多個catch語句捕獲不同類型在情況下的異常,try塊中引發不同的情況不止一個例外。

在C#中的異常類

C#異常由類表示。在C#中的異常類主要是直接或間接地來源於System.Exception類。有的從System.Exception類派生的異常類,它們是System.ApplicationException和System.SystemException類。

System.ApplicationException類支持由應用程序生成的異常。因此,由程序員定義的異常應該源於這個類。

System.SystemException類是所有預定義的係統異常的基類。

下表提供了一些從Sytem.SystemException類派生的預定義的異常類:

Exception類 描述
System.IO.IOException 處理 I/O 錯誤
System.IndexOutOfRangeException 處理的方法是指當一個數組索引超出範圍的錯誤產生
System.ArrayTypeMismatchException 處理時,類型不匹配的數組類型產生的錯誤
System.NullReferenceException 處理從取消引用一個空對象產生的錯誤
System.DivideByZeroException 處理來自將一個除零而產生的錯誤
System.InvalidCastException 處理類型轉換過程中產生的錯誤
System.OutOfMemoryException 處理來自可用內存不足產生的錯誤
System.StackOverflowException 處理從堆棧溢出產生的錯誤

處理異常

C#提供在try和catch塊的形式的結構化的解決異常處理問題。使用這些塊的核心程序語句從錯誤處理的語句分離。

這些錯誤處理模塊使用的是try, catch 和 finally 關鍵字實現。以下是當通過除以零發生拋出異常的一個例子:

using System;
namespace ErrorHandlingApplication
{
    class DivNumbers
    {
        int result;
        DivNumbers()
        {
            result = 0;
        }
        public void division(int num1, int num2)
        {
            try
            {
                result = num1 / num2;
            }
            catch (DivideByZeroException e)
            {
                Console.WriteLine("Exception caught: {0}", e);
            }
            finally
            {
                Console.WriteLine("Result: {0}", result);
            }

        }
        static void Main(string[] args)
        {
            DivNumbers d = new DivNumbers();
            d.division(25, 0);
            Console.ReadKey();
        }
    }
}

讓我們編譯和運行上麵的程序,這將產生以下結果:

Exception caught: System.DivideByZeroException: Attempted to divide by zero. 
at ...
Result: 0

創建用戶定義的異常

也可以定義自己的異常。用戶自定義異常類都源自於ApplicationException類。下麵的例子說明了這一點:

using System;
namespace UserDefinedException
{
   class TestTemperature
   {
      static void Main(string[] args)
      {
         Temperature temp = new Temperature();
         try
         {
            temp.showTemp();
         }
         catch(TempIsZeroException e)
         {
            Console.WriteLine("TempIsZeroException: {0}", e.Message);
         }
         Console.ReadKey();
      }
   }
}
public class TempIsZeroException: ApplicationException
{
   public TempIsZeroException(string message): base(message)
   {
   }
}
public class Temperature
{
   int temperature = 0;
   public void showTemp()
   {
      if(temperature == 0)
      {
         throw (new TempIsZeroException("Zero Temperature found"));
      }
      else
      {
         Console.WriteLine("Temperature: {0}", temperature);
      }
   }
}

讓我們編譯和運行上麵的程序,這將產生以下結果:

TempIsZeroException: Zero Temperature found

拋出對象

可以拋出一個對象,如果它是直接或間接地來源於System.Exception類。可以使用throw語句catch塊拋出對象如下:

Catch(Exception e)
{
   ...
   Throw e
}