Gewusst wie: Ausführen von Bereinigungscode mit finally (C#-Programmierhandbuch)

Mit einer finally-Anweisung soll sichergestellt werden, dass die notwendige Bereinigung von Objekten sofort erfolgt, auch wenn eine Ausnahme ausgelöst wird. Die zu bereinigenden Objekte enthalten in der Regel externe Ressourcen.Ein Beispiel für eine solche Bereinigung ist der Aufruf von Close für einen FileStream sofort nach der Verwendung, anstatt zu warten, dass das Objekt in die Garbage Collection der Common Language Runtime aufgenommen wird:

static void CodeWithoutCleanup()
{
    System.IO.FileStream file = null;
    System.IO.FileInfo fileInfo = new System.IO.FileInfo("C:\\file.txt");

    file = fileInfo.OpenWrite();
    file.WriteByte(0xF);

    file.Close();
}

Beispiel

Um den vorherigen Code in eine try-catch-finally-Anweisung umzuwandeln, wird der Bereinigungscode wie folgt vom Arbeitscode getrennt.

static void CodeWithCleanup()
{
    System.IO.FileStream file = null;
    System.IO.FileInfo fileInfo = null;

    try
    {
        fileInfo = new System.IO.FileInfo("C:\\file.txt");

        file = fileInfo.OpenWrite();
        file.WriteByte(0xF);
    }
    catch(System.UnauthorizedAccessException e)
    {
        System.Console.WriteLine(e.Message);
    }
    finally
    {
        if (file != null)
        {
            file.Close();
        }
    }
}

Da eine Ausnahme innerhalb eines try-Blocks jederzeit vor dem OpenWrite()-Aufruf auftreten oder der OpenWrite()-Aufruf selbst fehlschlagen kann, ist nicht garantiert, dass die Datei geöffnet ist, wenn versucht wird, sie zu schließen.Der finally-Block fügt eine Prüfung hinzu, um sicherzustellen, dass das FileStream-Objekt vor dem Aufruf der Close-Methode nicht null ist.Ohne die null-Prüfung löst der finally-Block möglicherweise eine eigene NullReferenceException aus. Das Auslösen von Ausnahmen in finally-Blöcken sollte jedoch möglichst vermieden werden.

Auch zum Schließen von Datenbankverbindungen sind finally-Blöcke gut geeignet.Da die Anzahl der zulässigen Verbindungen zum Datenbankserver manchmal begrenzt ist, ist es wichtig, Datenbankverbindungen zu schnell wie möglich zu schließen.Wenn der Fall eintritt, dass vor dem Schließen einer Verbindung eine Ausnahme ausgelöst wird, liegt eine weitere Situation vor, in der es günstiger ist, den finally-Block zu verwenden, als auf die Garbage Collection zu warten.

Siehe auch

Referenz

Ausnahmen und Ausnahmebehandlung (C#-Programmierhandbuch)

Ausnahmebehandlung (C#-Programmierhandbuch)

using-Anweisung (C#-Referenz)

try-catch (C#-Referenz)

try-finally (C#-Referenz)

try-catch-finally (C#-Referenz)

Konzepte

C#-Programmierhandbuch