try-finally (C#-Referenz)

Mit einem finally-Block können Sie alle Ressourcen bereinigen, die in einem try-Block belegt sind, und Sie können Code selbst dann ausführen, wenn eine Ausnahme im try-Block auftritt. In der Regel werden die Anweisungen eines finally-Blocks ausgeführt, wenn die Steuerung eine try-Anweisung verlässt. Die Übertragung eines Steuerelements kann infolge einer normalen Ausführung, der Ausführung einer break-, continue-, goto- oder return-Anweisung oder der Weitergabe einer Ausnahme aus der try-Anweisung auftreten.

Innerhalb einer behandelten Ausnahme ist sichergestellt, dass der zugeordnete finally-Block ausgeführt wird. Wenn die Ausnahme jedoch nicht behandelt wird, erfolgt die Ausführung des finally-Blocks je nachdem, wie der Entladevorgang für die Ausnahme ausgelöst wird. Das hängt wiederum davon ab, wie der Computer eingerichtet ist. Die einzigen Fälle, in denen finally-Klauseln nicht ausgeführt werden, betreffen die sofortige Beendigung eines Programms. Ein Beispiel hierfür ist das Auslösen von InvalidProgramException aufgrund von beschädigten IL-Anweisungen. Bei den meisten Betriebssystemen findet eine angemessene Ressourcenbereinigung statt, während der Prozess beendet und entladen wird.

Wenn eine Anwendung durch einen Ausnahmefehler beendet wird, ist es in der Regel nicht wichtig, ob der finally-Block ausgeführt wird. Wenn der finally-Block jedoch Anweisungen aufweist, die auch in dieser Situation ausgeführt werden müssen, kann als Lösung ein catch-Block der try-finally-Anweisung hinzugefügt werden. Sie können auch die Ausnahme abfangen, die möglicherweise im try-Block einer try-finally-Anweisung weiter oben in der Aufrufliste ausgelöst wird. Die Ausnahme kann also in der Methode abgefangen werden, mit der die Methode mit der try-finally-Anweisung aufgerufen wird. Die Ausnahme kann aber auch in der Methode abgefangen werden, mit der diese Methode aufgerufen wird, oder in einer beliebigen Methode in der Aufrufliste. Wenn die Ausnahme nicht abgefangen wird, wird der finally-Block je nachdem, ob vom Betriebssystem ein Entladevorgang für die Ausnahme ausgelöst wird, ausgeführt.

Beispiel

Im folgenden Beispiel wird eine System.InvalidCastException Ausnahme durch eine ungültige Konvertierungsanweisung verursacht. Die Ausnahme wird nicht behandelt.

public class ThrowTestA
{
    public 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
}

Im folgenden Beispiel wird eine Ausnahme von der TryCast-Methode in einer Methode weiter oben in der Aufrufliste abgefangen.

public class ThrowTestB
{
    public 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;
        }
    }

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

Weitere Informationen zu finally finden Sie unter try-catch-finally.

C# enthält auch die Using-Anweisung, die eine ähnliche Funktionalität für IDisposable-Objekte in einer zweckmäßigen Syntax bereitstellt.

C#-Sprachspezifikation

Weitere Informationen finden Sie im Abschnitt Die Try-Anweisung der C#-Sprachspezifikation.

Weitere Informationen