finally überflüssig?
-
Wozu ist eigentlich der finally-Block bei der Fehlerbehandlung gut? Er wird in jedem Fall ausgeführt, egal, ob ein Fehler aufgetreten ist oder nicht. Und der Quelltext nach dem finally-Block wird auch ausgeführt.
using System; static class Program { static void Main(string[] args) { Funktion(); Console.ReadLine(); } static void Ausnahmewurf(int i) { if (i == 0) { throw new Exception("Sie haben eine Null als Parameter übergeben."); } } static void Funktion() { try { Ausnahmewurf(0); } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { Console.WriteLine("finally-Block"); } Console.WriteLine("Nach der Fehlerbehandlung"); } }
Dieses Programm gibt mir folgendes aus:
Sie haben eine Null als Parameter übergeben. finally-Block Nach der Fehlerbehandlung
Wenn ich statt
Ausnahmewurf(0);
nun
Ausnahmewurf(5);
schreibe (Zeile 24), ist die Ausgabe so:
finally-Block Nach der Fehlerbehandlung
Ist der finally-Block nicht völlig überflüssig? Wenn ich die Funktion so schreibe:
static void Funktion() { try { Ausnahmewurf(0); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.WriteLine("finally-Block"); Console.WriteLine("Nach der Fehlerbehandlung"); }
kommt mit den entsprechenden Parametern exakt dieselbe Ausgabe wie in der ersten Version. Wieso gibt es also den finally-Block? Der Code nach der Fehlerbehandlung wird doch sowieso ausgeführt, wieso also noch einen Block, der als "wird nach dem try-catch-Block ausgeführt" definiert ist?
-
a) Du kannst in einem catch-Block auch wieder werfen
b) Du kannst statt der allg. Exception auch speziellere Exceptions fangen und andere nicht
c) Du kannst den catch-Block ganz weglassenIn beiden Fällen ändert sich Deine Ausgabe (sofern Du die Exception auf höherer Ebene fängst, sonst schlägt der Debugger zu). Probier's mal aus
-
Ah ja: Wenn man innerhalb des catch-Blocks noch einmal eine Exception wirft, wird der finally-Block ausgeführt, aber das darunter nicht mehr.
Vielen Dank.
-
Dann versuch mal das:
static bool Funktion() { try { Ausnahmewurf(0); return true; } catch (Exception ex) { Console.WriteLine(ex.Message); return false; } finally { Console.WriteLine("finally-Block"); } Console.WriteLine("Nach der Fehlerbehandlung"); }
-
NES-Spieler schrieb:
Ah ja: Wenn man innerhalb des catch-Blocks noch einmal eine Exception wirft, wird der finally-Block ausgeführt, aber das darunter nicht mehr.
'finally' wird *immer* ausgeführt. Nicht nur, wenn man Ausnahmen wirft oder 'return' verwendet, sondern sogar bei so obskuren Dingen wie 'goto' (das wird oft vergessen).
-
Konrad Rudolph schrieb:
NES-Spieler schrieb:
Ah ja: Wenn man innerhalb des catch-Blocks noch einmal eine Exception wirft, wird der finally-Block ausgeführt, aber das darunter nicht mehr.
'finally' wird *immer* ausgeführt. Nicht nur, wenn man Ausnahmen wirft oder 'return' verwendet, sondern sogar bei so obskuren Dingen wie 'goto' (das wird oft vergessen).
Ja, das meinte ich ja auch: Selbst, wenn man innerhalb des catch-Blocks noch einmal eine Exception wirft, wird der finally-Block ausgeführt, aber das darunter aber nach wie vor nicht mehr. (Das war kein ausschließendes "wenn", sondern ein einschließendes.)