try-finally (Справочник по C#)try-finally (C# Reference)

С помощью блока finally можно выполнить очистку всех ресурсов, выделенных в блоке try, и запускать код даже при возникновении исключения в блоке try.By using a finally block, you can clean up any resources that are allocated in a try block, and you can run code even if an exception occurs in the try block. Как правило, операторы блока finally выполняются, когда элемент управления покидает оператор try.Typically, the statements of a finally block run when control leaves a try statement. Передача управления может возникать в результате нормального выполнения, выполнения операторов break, continue, goto или return или распространения исключения из оператора try.The transfer of control can occur as a result of normal execution, of execution of a break, continue, goto, or return statement, or of propagation of an exception out of the try statement.

Внутри обработанного исключения гарантируется выполнение связанного блока finally.Within a handled exception, the associated finally block is guaranteed to be run. Однако если исключение не обработано, то выполнение блока finally зависит от того, как запускается операция развертывания исключения.However, if the exception is unhandled, execution of the finally block is dependent on how the exception unwind operation is triggered. Это, в свою очередь, зависит от способа настройки компьютера.That, in turn, is dependent on how your computer is set up.

Как правило, когда необработанное исключение приводит к завершению работы приложения, выполнение блока finally не имеет значения.Usually, when an unhandled exception ends an application, whether or not the finally block is run is not important. Однако если в блоке finally есть операторы, которые необходимо запускать даже в такой ситуации, одним из решений является добавление блока catch в оператор try-finally.However, if you have statements in a finally block that must be run even in that situation, one solution is to add a catch block to the try-finally statement. Кроме того, можно перехватить исключение, которое может создаваться в блоке try оператора try-finally выше в стеке вызовов.Alternatively, you can catch the exception that might be thrown in the try block of a try-finally statement higher up the call stack. То есть можно перехватить исключение в методе, который вызывает метод, содержащий оператор try-finally, или в методе, который вызывает этот метод, или в любом методе в стеке вызовов.That is, you can catch the exception in the method that calls the method that contains the try-finally statement, or in the method that calls that method, or in any method in the call stack. Если исключение не перехвачено, выполнение блока finally зависит от того, активирует ли операционная система операцию развертывания исключения.If the exception is not caught, execution of the finally block depends on whether the operating system chooses to trigger an exception unwind operation.

ПримерExample

В следующем примере недопустимый оператор преобразования вызывает исключение System.InvalidCastException.In the following example, an invalid conversion statement causes a System.InvalidCastException exception. Исключение не обрабатывается.The exception is unhandled.

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 перехватывается в методе выше в стеке вызовов.In the following example, an exception from the TryCast method is caught in a method farther up the call stack.

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.For more information about finally, see try-catch-finally.

C# также содержит оператор using, который предоставляет аналогичную функциональность для объектов IDisposable в удобном синтаксисе.C# also contains the using statement, which provides similar functionality for IDisposable objects in a convenient syntax.

Спецификация языка C#C# Language Specification

Дополнительные сведения см. в спецификации языка C#.For more information, see the C# Language Specification. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.The language specification is the definitive source for C# syntax and usage.

См. такжеSee Also

Справочник по C#C# Reference
Руководство по программированию на C#C# Programming Guide
Ключевые слова в C#C# Keywords
Операторы try, throw и catch (C++)try, throw, and catch Statements (C++)
Операторы обработки исключенийException Handling Statements
throwthrow
try-catchtry-catch
Практическое руководство. Явное создание исключенийHow to: Explicitly Throw Exceptions