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