try-finally(C# 参考)

通过使用 finally 块,可以清除 try 块中分配的任何资源,即使在 try 块中发生异常,也可以运行代码。 通常情况下,finally 块的语句会在控件离开 try 语句时运行。 正常执行中,执行 breakcontinuegotoreturn 语句,或者从 try 语句外传播异常都可能会导致发生控件转换。

已处理的异常中会保证运行相关联的 finally 块。 但是,如果异常未经处理,则 finally 块的执行将取决于异常解除操作的触发方式。 反过来,这又取决于你计算机的设置方式。 只有在 finally 子句不运行的情况下,才会涉及程序被立即停止的情况。 例如,由于 IL 语句损坏而引发 InvalidProgramException。 在大多数操作系统上,会在停止和卸载进程时进行合理的资源清理。

通常情况下,当未经处理的异常终止应用程序时,finally 块是否运行已不重要。 但是,如果 finally 块中的语句必须在这种情况下运行,则可以将 catch 块添加到 try-finally 语句,这是其中一种解决方法。 另一种解决方法是,可以捕获可能在调用堆栈上方的 try-finally 语句的 try 块中引发的异常。 也就是说,可以通过以下几种方法来捕获异常:调用包含 try-finally 语句的方法、调用该方法或调用堆栈中的任何方法。 如果未捕获异常,则 finally 块的执行取决于操作系统是否选择触发异常解除操作。

示例

在以下示例中,无效的转换语句会导致 System.InvalidCastException 异常。 异常未经处理。

public class ThrowTestA
{
    public 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
{
    public 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;
        }
    }

    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# 语言规范中的 try 语句部分。

另请参阅