Udostępnij za pośrednictwem


try-finally (odwołanie w C#)

Za pomocą finally bloku, można oczyścić wszystkie zasoby, które są przydzielane w spróbuj bloku, i można uruchomić kod, nawet jeśli wystąpi wyjątek w try bloku.Typowo, instrukcje bloku finally s=uruchamiają się kiedy formant opuszcza instrukcję try.Przeniesienie kontroli może wystąpić w wyniku normalnego wykonania, wykonania break, continue, goto lub return instrukcji lub propagacji wyjątku z instrukcji try.

Wewnątrz obsługiwanego wyjątku, powiązany blok finally na pewno zostanie uruchomiony.W przypadku nieobsługiwanego wyjątku wykonanie bloku finally jest zależne od tego, jak wywoływany jest wyjątek operacji rozwinięcia.To z kolei zależy od konfiguracji komputera.Aby uzyskać więcej informacji, zobacz Przetwarzanie nieobsługiwanych wyjątków w CLR.

Zwykle, kiedy nieobsłużony wyjątek kończy aplikację, nie jest istotne czy blok finally jest uruchomiony, czy nie.Jednakże jeśli masz instrukcje w bloku finally, który musi być uruchamiany nawet w tej sytuacji, rozwiązaniem jest dodanie bloku catch do instrukcji try-finally.Alternatywnie, można wychwycić wyjątek, który może zostać wygenerowany w try blok z try-finally instrukcji wyższego rzędu stosu wywołań.To znaczy można wykryć wyjątek w metodzie, która wywołuję metodę zawierającą try-finally instrukcję, lub w metodzie, która wywołuje tę metodę, lub dowolną metodę w stosie wywołań.Jeśli wyjątek nie zostanie przechwycony, wykonanie finally bloku zależy od tego, czy system operacyjny wybierze wywołanie wyjątku operacji rozwijania.

Przykład

W poniższym przykładzie instrukcja nieprawidłowej konwersji powoduje wyjątek System.InvalidCastException.Wyjątek 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 metody TryCast padł w metodzie dalej położonej w stosie 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 dotyczących instrukcji finally, zobacz instrukcje try-catch-finally.

C# zawiera również za pomocą instrukcji, który zapewnia podobną funkcjonalność dla IDisposable obiektów w wygodnej składni.

Specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.

Zobacz też

Zadania

Porady: jawne zgłaszanie wyjątków

Informacje

Słowa kluczowe języka C#

Instrukcje try, throw i catch (C++)

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

throw (odwołanie w C#)

try-catch (odwołanie w C#)

Koncepcje

Przewodnik programowania w języku C#

Inne zasoby

Odwołanie w C#