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 weglassen

    In 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.)


Anmelden zum Antworten