Sdílet prostřednictvím


Zkuste finally (C#-Reference)

finally Bloku je vhodný pro čištění všechny prostředky, které jsou přiděleny v akci blokovat a pro spuštění jakýkoli kód, který musí provést i v případě, že dojde k výjimce v try bloku.Obvykle výkazy finally bloku jsou spouštěny při řízení ponechá try prohlášení, zda dojde k ovládání z Normální spuštění, provádění break, continue, goto, nebo return prohlášení, nebo šíření výjimku z try prohlášení.

V rámci zpracoval výjimku přidružených finally bloku je zaručena spustit.Však pokud neošetřené výjimky, provádění finally bloku je závislá na aktivaci jak unwind výjimku operace.Která zase závisí na nastavení vašeho počítače.Další informace naleznete v Neošetřená výjimka zpracování CLR.

Obvykle při neošetřené výjimky končí aplikace, zda finally bloku je spustit, není důležité.Však máte příkazy v finally blok, který je nutné spustit i v situaci, řešením je přidání catch k blokování try-finally prohlášení.Alternativně můžete zachytit výjimku, která může být vyvolána v try blokovat z try-finally prohlášení vyšší pozici zásobníku volání.Je zachytit výjimku v metodě, která volá metodu, která obsahuje try-finally prohlášení nebo v metodě, která volá metodu, nebo v jakékoli metody v zásobníku volání.Je-li výjimka nebyla zachycena, provádění finally bloku závisí na zda zvolí operačního systému pro spuštění výjimky operace unwind.

Příklad

V následujícím příkladu příkazu Neplatný převod způsobí, že System.InvalidCastException výjimku.Neošetřená výjimka.

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
}

V následujícím příkladu výjimku z TryCast metoda uvízl v metodě dále nahoru zásobníku volání.

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

Další informace o finally, viz try-catch-finally.

C# obsahuje také pomocí příkazu, který poskytuje pohodlný syntaxi pro stejné funkce jako try-finally prohlášení.

Specifikace jazyka C#

Další informace naleznete v tématu Specifikace jazyka C#. Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.

Viz také

Úkoly

Jak: výjimky vyvolat explicitně

Referenční dokumentace

Klíčová slova jazyka C#

Zkuste, úlovku a vyvoláním prohlášení (C++)

Příkazy (C#-Reference) zpracování výjimek

vyvoláním (C#-Reference)

try-catch (C#-Reference)

Koncepty

Příručka programování C#

Další zdroje

C#-Reference