try-finally(C# 参考)

finally 块清理在 尝试 分配块,并且,对于运行任何代码必须执行的所有资源非常有用,即使异常出现在块的 try 发生。 通常, finally 的语句块执行时,控件将 try 语句,控制权转换由于正常执行,的 break、 continue、 goto或 return 语句时,的执行结果是否,或者异常的发送在 try 语句外部。

在已处理的异常中,关联的 finally 块来确保运行。 但是,因此,如果异常处理, finally 的执行块依赖异常的方式展开操作将触发。 此操作,因此,依赖于计算机如何设置为。 有关更多信息,请参见 Unhandled Exception Processing in the CLR

通常,那么,当未经处理的异常关闭应用程序, finally 块是运行并不重要。 但是,因此,如果您有语句。即使在该情况必须运行的 finally 块,一个解决方案是添加 catch 块。 try-finally 语句。 或者,可以捕获 try 可能会引发块一个 try-finally 语句更高调用堆栈的异常。 即可以捕获调用方法包含 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 最终

C# 还包含 使用语句,为功能提供一种方便语法和 try-finally 语句相同。

C# 语言规范

有关更多信息,请参见 C# 语言规范。该语言规范是 C# 语法和用法的权威资料。

请参见

任务

如何:显式引发异常

参考

C# 关键字

尝试,捕获,并引发语句(C++)

异常处理语句(C# 参考)

throw(C# 参考)

try-catch(C# 参考)

概念

C# 编程指南

其他资源

C# 参考