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

С помощью блока finally можно выполнить очистку всех ресурсов, выделенных в блоке try, и можно запускать код даже при возникновении исключения в блоке try. Как правило, операторы блока finally выполняются, когда элемент управления покидает оператор try. Передача управления может возникать в результате выполнения нормального выполнения, break, continue, goto или оператора return, или распространения исключения из оператора try.

Внутри обработанного исключения гарантируется выполнение соответствующий блок finally. Однако если исключение не обработано, то выполнение блока finally зависит от того, как запускается операция развертывания исключения. Это, в свою очередь, зависит от способа настройки компьютера. Дополнительные сведения см. в статье Обработка необработанных исключений в 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-finally.

C# также содержит оператор using, который предоставляет аналогичную функциональность для объектов IDisposable в удобном синтаксисе.

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

Дополнительные сведения см. в Спецификация языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

См. также

Задачи

Практическое руководство. Явное создание исключения

Ссылки

Ключевые слова C#

Операторы try, throw и catch (C++)

Операторы обработки исключений (Справочник по C#)

throw (Справочник по C#)

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

Основные понятия

Руководство по программированию на C#

Другие ресурсы

Справочник по C#