Udostępnij za pośrednictwem


try-finally (C# odniesienia)

finally Bloku jest przydatne do czyszczenia wszystkie zasoby, które są przydzielane w Spróbuj zablokować i uruchamiania dowolnego kodu należy wykonać nawet, jeśli wystąpi wyjątek w try bloku.Zazwyczaj, sprawozdania z finally bloku są wykonywane, gdy formant opuszcza try oświadczenie, czy występuje przekazywanie sterowania z normalnego wykonywania realizacji break, continue, goto, lub return instrukcji, lub rozmnażania wyjątek z try instrukcji.

W ramach obsłużył wyjątek skojarzonym finally bloku jest gwarantowane do uruchomienia.Jednakże jeśli nieobsługiwany wyjątek, wykonanie finally bloku jest zależna od jak wyjątek relaks operacji zostanie wywołany.Że, z kolei jest zależna od konfiguracji komputera.Aby uzyskać więcej informacji, zobacz Przetwarzania nieobsługiwany wyjątek w CLR.

Zwykle, gdy nieobsłużony wyjątek kończy aplikację, czy też nie finally uruchomieniu bloku nie jest ważna.Jednakże jeśli instrukcji finally blok, które muszą być uruchamiane, nawet w takiej sytuacji, jednym rozwiązaniem jest dodanie catch bloku try-finally instrukcji.Alternatywnie, można wychwycić wyjątek, który może zostać wygenerowany w try zablokować z try-finally instrukcji wyższego rzędu stosu wywołań.Oznacza to, że może przechwycić wyjątek w metodzie, który wywołuje metodę, która zawiera try-finally instrukcję, metodę, która wywołuje metodę tym, lub w dowolnym metoda w stos wywołań.Jeśli nie jest wyjątek, wykonanie finally bloku zależy od tego, czy system operacyjny wybiera do wyzwalania wyjątek relaks operacji.

Przykład

W poniższym przykładzie instrukcja Nieprawidłowa konwersja powoduje, że System.InvalidCastException wyjątku.Wyjątkiem jest nieobsługiwany.

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
}

W poniższym przykładzie wyjątek od TryCast metody połowu w metodzie odległość w górę stosu wywołań.

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.
}

Aby uzyskać więcej informacji o finally, zobacz try-catch-finally.

C# zawiera również za pomocą instrukcji, wygodne składni który przewiduje takie same funkcje jak try-finally instrukcji.

Specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#. Specyfikacja języka to najlepsze źródło informacji dotyczących składni i zastosowania języka C#.

Zobacz też

Zadania

Jak: jawnie generują wyjątki

Informacje

Słowa kluczowe języka C#

Spróbuj połowu i throw sprawozdań (C++)

Instrukcje (C# odniesienia) obsługi wyjątków

rzut (C# odniesienia)

try-catch (C# odniesienia)

Koncepcje

Podręcznik programowania C#

Inne zasoby

C# odniesienia