共用方式為


try-finally (C# 參考)

透過使用 finally 區塊,您可以清除在 try 區塊中配置的所有資源,即使 try 區塊中發生例外狀況,您也可以執行程式碼。 finally 區塊的陳述式通常會在控制權離開 try 陳述式時執行。 控制權的轉移可能因為正常執行;執行 break、continue、goto 或 return 陳述式;或者將例外狀況傳播至 try 陳述式範圍之外而發生。

在已處理的例外狀況中,會保證執行相關聯的 finally 區塊。 不過,如果例外狀況是未處理的,finally 區塊執行取決於例外狀況回溯作業的觸發方式。 接著,這將取決於您的電腦是如何設定的。 如需詳細資訊,請參閱 CLR 中未處理之例外狀況的處理機制

當發生未處理的例外狀況而結束應用程式時,是否執行 finally 區塊通常不重要。 不過,如果在 finally 區塊中的陳述式即使在那種情況下必須執行,其中一個解決方法是將 catch 區塊到 try-finally 陳述式。 或者,您可以攔截在呼叫堆疊中較高層 try-finally 陳述式的 try 區塊可能會擲回的例外狀況。 也就是,您可以在呼叫包含 try-finally 陳述式之方法的方法中、在呼叫該方法的方法中,或在呼叫堆疊的任何方法中,攔截例外狀況。 如果未攔截例外狀況,則根據作業系統是否選取觸發例外狀況回溯作業,來決定 finally 區塊的執行。

範例

在下列範例中,無效的轉換陳述式會造成 System.InvalidCastException 例外狀況。 例外狀況為未處理。

public class ThrowTestA
{
    static void Main()
    {
        int i = 123;
        string s = "Some string";
        object obj = s;

        try
        {
            // Invalid conversion; obj contains a string, not a numeric type.
            i = (int)obj;

            // The following statement is not run.
            Console.WriteLine("WriteLine at the end of the try block.");
        }
        finally
        {
            // To run the program in Visual Studio, type CTRL+F5. Then  
            // click Cancel in the error dialog.
            Console.WriteLine("\nExecution of the finally block after an unhandled\n" +
                "error depends on how the exception unwind operation is triggered.");
            Console.WriteLine("i = {0}", i);
        }
    }
    // Output: 
    // Unhandled Exception: System.InvalidCastException: Specified cast is not valid. 
    // 
    // Execution of the finally block after an unhandled 
    // error depends on how the exception unwind operation is triggered. 
    // i = 123
}

在下列範例中,來自 TryCast 方法的例外狀況是在位於呼叫堆疊更上方的方法中攔截到。

public class ThrowTestB
{
    static void Main()
    {
        try
        {
            // TryCast produces an unhandled exception.
            TryCast();
        }
        catch (Exception ex)
        {
            // Catch the exception that is unhandled in TryCast.
            Console.WriteLine
                ("Catching the {0} exception triggers the finally block.",
                ex.GetType());

            // Restore the original unhandled exception. You might not 
            // know what exception to expect, or how to handle it, so pass  
            // it on. 
            throw;
        }
    }

    public static void TryCast()
    {
        int i = 123;
        string s = "Some string";
        object obj = s;

        try
        {
            // Invalid conversion; obj contains a string, not a numeric type.
            i = (int)obj;

            // The following statement is not run.
            Console.WriteLine("WriteLine at the end of the try block.");
        }
        finally
        {
            // Report that the finally block is run, and show that the value of 
            // i has not been changed.
            Console.WriteLine("\nIn the finally block in TryCast, i = {0}.\n", i);
        }
    }
    // Output: 
    // In the finally block in TryCast, i = 123. 

    // Catching the System.InvalidCastException exception triggers the finally block. 

    // Unhandled Exception: System.InvalidCastException: Specified cast is not valid.
}

如需 finally 的詳細資訊,請參閱 try-catch-finally

C# 也包含 using 陳述式,以方便語法提供類似的 IDisposable 物件功能。

C# 語言規格

如需詳細資訊,請參閱<C# 語言規格>。語言規格是 C# 語法及用法的限定來源。

請參閱

工作

如何:明確擲回例外狀況

參考

C# 關鍵字

try、throw 和 catch 陳述式 (C++)

例外狀況處理陳述式 (C# 參考)

throw (C# 參考)

try-catch (C# 參考)

概念

C# 程式設計手冊

其他資源

C# 參考