Verwenden von finally-BlöckenHow to use finally blocks

Wenn eine Ausnahme auftritt, wird die Ausführung beendet und die Steuerung an den entsprechenden Ausnahmehandler übergeben.When an exception occurs, execution stops and control is given to the appropriate exception handler. Dies bedeutet häufig, dass Codezeilen umgangen werden, die eigentlich ausgeführt werden sollten.This often means that lines of code you expect to be executed are bypassed. Daher muss auch nach Auslösen einer Ausnahme eine Ressourcenbereinigung durchgeführt werden, z.B. das Schließen einer Datei.Some resource cleanup, such as closing a file, needs to be done even if an exception is thrown. Zu diesem Zweck können Sie einen finally-Block verwenden.To do this, you can use a finally block. Ein finally-Block wird immer ausgeführt, unabhängig davon, ob eine Ausnahme ausgelöst wird.A finally block always executes, regardless of whether an exception is thrown.

Das folgende Codebeispiel verwendet einen try/catch-Block, um eine ArgumentOutOfRangeException abzufangen.The following code example uses a try/catch block to catch an ArgumentOutOfRangeException. Die Main-Methode erstellt zwei Arrays und versucht, das eine Array in das andere zu kopieren.The Main method creates two arrays and attempts to copy one to the other. Die Aktion generiert eine ArgumentOutOfRangeException, und der Fehler wird an die Konsole geschrieben.The action generates an ArgumentOutOfRangeException and the error is written to the console. Der finally-Block wird unabhängig vom Ergebnis des Kopiervorgangs ausgeführt.The finally block executes regardless of the outcome of the copy action.

using namespace System;

ref class ArgumentOutOfRangeExample
{
public:
    static void Main()
    {
        array<int>^ array1 = {0, 0};
        array<int>^ array2 = {0, 0};

        try
        {
            Array::Copy(array1, array2, -1);
        }
        catch (ArgumentOutOfRangeException^ e)
        {
            Console::WriteLine("Error: {0}", e);
            throw;
        }
        finally
        {
            Console::WriteLine("This statement is always executed.");
        }
    }
};

int main()
{
    ArgumentOutOfRangeExample::Main();
}
using System;

class ArgumentOutOfRangeExample
{
    public static void Main()
    {
        int[] array1 = {0, 0};
        int[] array2 = {0, 0};

        try
        {
            Array.Copy(array1, array2, -1);
        }
        catch (ArgumentOutOfRangeException e)
        {
            Console.WriteLine("Error: {0}", e);
            throw;
        }
        finally
        {
            Console.WriteLine("This statement is always executed.");
        }
    }
}
Class ArgumentOutOfRangeExample
    Public Shared Sub Main()
        Dim array1() As Integer = {0, 0}
        Dim array2() As Integer = {0, 0}

        Try
            Array.Copy(array1, array2 , -1)
        Catch e As ArgumentOutOfRangeException
            Console.WriteLine("Error: {0}", e)
            Throw
        Finally
            Console.WriteLine("This statement is always executed.")
        End Try
    End Sub
End Class

Siehe auchSee also