例外狀況和例外狀況處理

C# 語言的例外狀況處理功能可協助您處理在程式執行時發生的任何未預期或例外狀況。 例外狀況處理 try 會使用、 catchfinally 關鍵字來嘗試可能不會成功的動作,以便在您決定是否合理進行時處理失敗,並在之後清除資源。 例外狀況可由 common language runtime (CLR) 、.NET 或協力廠商程式庫,或應用程式程式碼產生。 例外狀況是使用 throw 關鍵字所建立。

在許多情況下,例外狀況可能不是由您的程式碼直接呼叫的方法所擲回,而是由呼叫堆疊中更下方的另一個方法所擲回。 擲回例外狀況時,CLR 會回溯堆疊,尋找具有 catch 特定例外狀況類型之區塊的方法,並執行第一個這類的 catch 區塊(如果找到的話)。 如果在呼叫堆疊中的任何地方都找不到適當的 catch 區塊,它將會終止處理序,並向使用者顯示一則訊息。

在此範例中,方法會測試除數為零,並攔截錯誤。 如果沒有例外狀況處理,此程式就會終止並產生 DivideByZeroException 未處理 的錯誤。

public class ExceptionTest
{
    static double SafeDivision(double x, double y)
    {
        if (y == 0)
            throw new DivideByZeroException();
        return x / y;
    }

    public static void Main()
    {
        // Input for test purposes. Change the values to see
        // exception handling behavior.
        double a = 98, b = 0;
        double result;

        try
        {
            result = SafeDivision(a, b);
            Console.WriteLine("{0} divided by {1} = {2}", a, b, result);
        }
        catch (DivideByZeroException)
        {
            Console.WriteLine("Attempted divide by zero.");
        }
    }
}

例外狀況概觀

例外狀況具有下列屬性:

  • 例外狀況是最終全都衍生自 System.Exception 的型別。
  • 在可能擲回例外狀況的陳述式前後使用 try 區塊。
  • 一旦 try 區塊中發生例外狀況之後,控制流程就會跳至第一個相關聯的例外狀況處理常式,此處理常式存在於呼叫堆疊中的任何位置。 在 C# 中,catch 關鍵字是用來定義例外狀況處理常式。
  • 如果沒有指定例外狀況的例外狀況處理常式存在,程式就會停止執行並出現錯誤訊息。
  • 除非您可以處理例外狀況,並讓應用程式處於已知狀態,否則請勿攔截例外狀況。 如果您攔截 System.Exception,請在 catch 區塊結尾使用 throw 關鍵字重新擲回它。
  • 如果 catch 區塊定義了例外狀況變數,您可以使用它來取得所發生例外狀況型別的詳細資訊。
  • 例外狀況可以透過程式使用 throw 關鍵字明確地產生。
  • 例外狀況物件包含錯誤的詳細資訊,例如呼叫堆疊的狀態和錯誤狀態的文字描述。
  • 無論是否擲回例外狀況,區塊中的 finally 程式碼都會執行。 使用 finally 區塊來釋放資源,例如,關閉已在 try 區塊中開啟的任何資料流或檔案。
  • .NET 中的 Managed 例外狀況會在 Win32 結構化例外狀況處理機制之上執行。 如需詳細資訊,請參閱結構化例外狀況處理 (C/C++)深入探究 Win32 結構化例外狀況處理的毀損課程 (英文)

C# 語言規格

如需詳細資訊,請參閱 C# 語言規格中的例外狀況。 語言規格是 C# 語法及用法的限定來源。

另請參閱