Vorteil von Exceptions gegenüber if-Abfragen



  • Welche sind das? Ich finde if-Abfragen genauso sinnvoll und irgendwie intuitiver. (Am Besten mit Beispiel)



  • http://www.c-plusplus.net/forum/viewtopic-var-t-is-219864.html

    schau dir zB den ersten Code dort an und dann sag mir nochmal dass du das intuitiv und sinnvoll findest 😉



  • Exceptions machen den Code nur hässlich 😞



  • skullyan schrieb:

    Welche sind das? Ich finde if-Abfragen genauso sinnvoll und irgendwie intuitiver.

    Grundsätzlich: Eine Exception ist für Ausnahmefälle, nicht für normale Abfragen gedacht.

    Aber wenn du eigentlich fragen willst, warum eine Exception besser als die Abfrühstückung von Fehlercodes ist, dann gebe ich dir eine Antwort:

    1. Fehlercodes lassen sich häufig ignorieren (und das auch ohne Absicht).
    2. Man kann die Fehlerbehandlung an die Stelle verfrachten, die damit zurecht kommt.
    3. Man kann tiefe Verschachtelungen vermeiden.

    Hier ein kleines Beispiel das einen Teil der Vorzüge von Exceptions (in Kombination mit RAII) aufzeigt. Nehmen wir einfach mal an, du hast eine Klasse mit drei Ressourcen die du mittels new allozierst, und im Fehlerfall müssen bereits allozierte Freigegeben werden.

    // Behandlung mit RAII und Exceptions
    #include <boost/scoped_ptr.hpp>
    
    class A {};
    class B
    {
      private:
        boost::scoped<A> a1;
        boost::scoped<A> a2;
        boost::scoped<A> a3;
    
      B()
      : a1(new A()),
        a2(new A()),
        a3(new A())
      {
      }
    };
    
    int main()
    {
        try
        {
            B b;
            // <-- Hier tust du nun was mit b
        }
        catch(...) // Ich behandel hier mal alle, stellvertretend für die möglichen
        {          // Exceptions.
            // <-- Fehlerbehandlung
        }
    }
    

    Versuch dies mal ähnlich kurz mit Fehlercodes und if zu realisieren...



  • ExceptionExecutor schrieb:

    Exceptions machen den Code nur hässlich 😞

    Falsch. Exceptions sinnvoll verwendet machen Code sogar ungleich leserlicher (und meist auch wesentlich kürzer).



  • ExceptionExecutor schrieb:

    Exceptions machen den Code nur hässlich 😞

    Während bei Returncodes JEDE Funktion schauen muss, ob eine Funktion, die sie aufruft eventuell einen Fehlercode zurückgegeben hat (zig if-abfragen) und den Fehlercode weitergibt, können bei exceptions richtig implementierte Funktionen nichts von Fehlerbehandlung erkennen lassen.
    Nehmen wir an, wir haben eine Aufrufhierarchie von Funktionen A->B->C->D->E, wobei E einen Fehler melden kann, der in A behandelt werden muss. Mit exceptions steht in E ein throw, in A ein try/catch mit der Fehlerbehandlung. Mit Returncodes steht in E ein return XYZ, in A ein if (rc == XYZ), und in B, C, D wird der Returncode abgefragt, um ggf. verfrüht abzubrechen und ihn weiterzureichen. Das fällt bei exceptionsicherer Implementierung komplett weg.


Log in to reply