Wie wird der finally-Block ausgeführt?



  • Hallo,

    Ich frage mich gerade, ob der finally-Block einer try/catch/finally Konstruktion IMMER ausgeführt wird? Mir stellt sich folgendes Problem

    // Methode eins (funzt das?)
                try
                {
                    if (l.Execute(/*params*/) == false)
                    {
                        throw new Exception("ganz pöser error");
                    }
                }
                catch (Exception ganzpoese)
                {
                    // loggen
                    throw new Exception("jetzt aber schnell raus hier");
                }
                finally
                {
                    // ganz viele Sachen bereinigen
                    l.Close();
                }
    
                // Methode zwei (umständlich und unübersichtlich
                try
                {
                    if (l.Execute(/*params*/) == false)
                    {
                        // ganz viele Sachen bereinigen
                        l.Close();
                        throw new Exception(/*Transaktionskette abbrechen*/);
                    }
                    // ganz viele Sachen bereinigen, l.Close()
    
                }
    

    Es geht darum, dass ich aus einer langen Transaktionskette aussteigen muss, deshalb das throw... und die "Sachen bereinigen" umfassen circa 20 Zeilen.

    tl;dr - wird der finally-block auch ausgeführt, wenn ich im catch-Block mit einer weiteren Exception raussteige?



  • Interessante Frage, im Galileo Openbook steht dazu folgendes:

    Der Code innerhalb des finally-Blocks wird in jedem Fall vor Verlassen der Funktion ausgeführt, unabhängig davon, ob eine Ausnahme aufgetreten ist oder nicht.

    Inwiefern das allerdings noch greift wenn im catch-Teil eine weitere Exception geworfen wird müsstest du dann wohl probieren.



  • Im Catch-Block eine Exception zu werfen dürfte vom Control-Fluss nichts anderes sein, als keinen Catch-Block zu haben.

    Ergo: Ja.



  • Der finally block wird immer ausgeführt, du müsstest den Prozess schon mit einem externen Tool Killen wenn finally nicht greifen soll.



  • Danke für eure Antworten 🙂


Anmelden zum Antworten