Sdílet prostřednictvím


try-finally (Referenční dokumentace jazyka C#)

Pomocí bloku finally můžete vyčistit všechny prostředky, které jsou přiděleny v bloku try a můžete spouštět kód, i když dojde k výjimce v bloku try.Obvykle příkaz bloku finally se spustí, jakmile opustí ovládací prvek opustí příkaz try.Převod řízení se může vyskytnout v důsledku normálního provedení, provedení příkazu break, continue, goto nebo return nebo šíření výjimky z příkazu try.

V rámci zpracování výjimek je zaručen běh přidružených bloků finally.Pokud však není výjimka ošetřena, provedení bloku finally je závislé na tom, jak se spustí operace unwind výjimek.To je dále závislé na nastavení vašeho počítače.Více informací viz Zpracování neošetřené výjimky v CLR.

Obvykle po neošetřené výjimce ukončení aplikaci. To, zda blok finally je spuštěn nebo ne, není důležité.Používáte-li však příkazy v bloku finally, který musí být spuštěn i v této situaci, jedním řešením je přidat blok catch do příkazu try-finally.Alternativně můžete zachytit výjimku, která může být vyvolána v bloku try příkazu try-finally výše v zásobníku volání.To znamená, že výjimku můžete zaznamenat v metodě, která volá metodu s prohlášením try-finally, nebo v metodě, která danou metodu volá, nebo v jakékoli metodě v zásobníku volání.Pokud není výjimka zachycena, provádění bloku finally závisí na tom, zda operační systém zvolí pro spuštění výjimky operaci unwind.

Příklad

V následujícím příkladu způsobuje neplatný výraz převodu výjimku System.InvalidCastException.Výjimka je neošetřená.

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 je zachycena výjimka z metody TryCast v metodě hlouběji v 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 klíčovém slovu finally naleznete v tématu try-catch-finally.

C# obsahuje také příkaz using, který poskytuje podobné funkce pro objekty IDisposable pomocí pohodlné syntaxe.

Specifikace jazyka C#

Další informace najdete 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

Postupy: Explicitní generování výjimek

Referenční dokumentace

Klíčová slova jazyka C#

try, throw a catch – příkazy (C++)

Příkazy zpracování výjimek (Referenční dokumentace jazyka C#)

throw (Referenční dokumentace jazyka C#)

try-catch (Referenční dokumentace jazyka C#)

Koncepty

Průvodce programováním v C#

Další zdroje

Referenční dokumentace jazyka C#