Поделиться через


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

finally блок полезен для очистки все ресурсы, выбранные в Try блок, и для выполнения любой код, который должен выполняться даже при возникновении исключения в try блок.Обычно выписки a finally блок выполняется, когда элемент управления отображается, a try выписка, происходит ли переключение элемента управления в результате нормального выполнения выполнения a break" continue" gotoили return оператор или распространения исключения из try выписка.

В рамках обработки исключений, связанное finally гарантированно выполняться блок.Однако если необработанные исключения, то выполнение finally блок зависит от того, как исключение активировано завершающей операции.Это, в свою очередь, зависит от того, как на компьютере установки.Дополнительные сведения см. в разделе Необработанное исключение при обработке среды CLR.

Обычно, когда необработанное исключение завершает приложение, ли finally автоматически не важен.Однако если имеется выписки в выражении finally отключение которая должна быть запущена, даже в этой ситуации одно решение добавить a catch блок в try-finally выписка.Кроме того, можно перехватить исключение, которое может создаваться в try блок a try-finally выписка выше вверх по стеку вызовов.То есть можно перехватить исключение в методе, который вызывает метод, содержащий try-finally оператор или в методе, который вызывает этот метод или в любом методе в стеке вызова.Если исключение не перехватывается, то выполнение finally отключите, зависит от того, выбирает ли операционная система, чтобы активировать исключение операцию очистки.

Пример

В следующем примере недопустимый оператор преобразования приводит к a 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см. попытк-CATCH-окончательн.

В c# также содержит использование выписку, которая обеспечивает удобный синтаксис для функций, как a try-finally выписка.

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

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

См. также

Задачи

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

Ссылки

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

попробуйте, перехватывайте и вызывайте выписки (C++)

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

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

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

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

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

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

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