C#異常處理

異常(例外)是在執行程序期間出現的問題。 C# 異常是對程序運行時出現的異常情況的響應,例如:除以零的算術運算。

異常提供了將控制從程序的一個部分轉移到另一個程序的方法。 C# 異常處理建立在四個關鍵字上:trycatchfinallythrow

  • trytry塊標識一個特定異常被激活的代碼塊。try塊之後有一個或多個catch塊。
  • catch:程序在處理問題的程序中的某個位置使用異常處理程序捕獲異常。catch關鍵字表示捕獲異常。
  • finallyfinally塊用於執行給定的一組語句,無論拋出異常還是拋出異常。例如,如果打開文件,則不管是否引發異常,都必須關閉該文件。
  • throw:當出現問題時,程序會拋出異常。這是使用throw關鍵字完成的。

語法

假設一個塊引發異常,一個方法使用trycatch關鍵字的組合來捕獲異常。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塊在不同情況(case)下引發多個異常。

C# 異常類

C# 異常由類表示。 C# 中的異常類主要直接或間接地從System.Exception類派生。 從System.Exception類派生的一些異常類是System.ApplicationExceptionSystem.SystemException類。

System.ApplicationException類支持應用程序生成的異常。因此,程序員定義的異常應該從這個類派生出來。

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

下表列出了一些從System.SystemException類派生的一些預定義的異常類:

異常類

描述

System.IO.IOException

處理I/O錯誤

System.IndexOutOfRangeException

處理當方法引用數組索引超出範圍時生成的錯誤。

System.ArrayTypeMismatchException

處理類型與數組類型不匹配時生成的錯誤。

System.NullReferenceException

處理從引用空(null)對象而產生的錯誤。

System.DivideByZeroException

處理除以零產生的錯誤。

System.InvalidCastException

處理類型轉換過程中產生的錯誤。

System.OutOfMemoryException

處理由於空閒內存不足而產生的錯誤。

System.StackOverflowException

處理由於空閒內存不足而產生的錯誤。

System.StackOverflowException

處理堆棧溢出產生的錯誤。

處理異常

C# 以trycatch塊的形式提供了異常處理的結構化解決方案。使用這些塊,核心程序語句與錯誤處理語句分離。

這些錯誤處理塊使用trycatchfinally關鍵字實現。下面是一個除以零條件發生異常時的異常:

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

用戶定義的異常

您也可以定義自己的異常。用戶定義的異常類派生自Exception類。以下示例演示如何創建一個自定義異常:

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: Exception
{
   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類,則可以拋出一個對象。可以在catch塊中使用throw語句將當前對象拋出:

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