Sauberes Exception-Handling



  • Hi

    Ich finde aus irgendeinem Grund keine saubere Lösung für try-throw-catch. Es soll so sein, dass im catch-Block die Exception nicht zerstört werden muss (z.B. mit delete).

    Wie ich das sehe, gibt es zwei Möglichkeiten zum Werfen von Exceptions:

    class CException;
    ...
    1. throw CException;
    2. throw new CException;
    

    Und zum Fangen der Exceptions:

    1. catch ( CException* pExc )
    2. catch ( CException Exc )
    3. catch ( CException& Exc )
    

    Jetzt funktioniert aber keine dieser Kombinationen befriedigend. Bei throw CException wird einmal der Konstruktor und 3 mal (mit catch (CException Exc) bzw 2 mal (mit catch (CException& Exc) der Destruktor aufgerufen.
    Das "Beste" scheint mir noch throw new CException mit catch ( CException pExc )*. Nur dabei wird die Exception nie gelöscht, was unter Umständen zu großen Speicherleaks führen kann.

    Hat vielleicht jemand eine gute Lösung, ohne Leaks und ohne die Exception im catch-Block explizit zu zerstören?



  • throw CException; und fangen per const ref.





  • OK, danke erstmal 🙂



  • Wie macht std::runtime_error das? Irgendwie schafft es das, dass der Destruktor nur einmal aufgerufen wird! Es klappt zwar damit, aber irgendwie fände ich es schöner, wenn es auch ohne std::runtime_error gehen würde 🤡



  • throw CException; und fangen per const ref

    Wieso const?
    Mir ist der Sinn von const bekannt, allerdings sehe ich
    hier den Sinn nicht. Nur damit man für den catch-Block
    sieht, dass die Exception nicht verändert wird?
    Oder was soll das?



  • Manche Compiler können dadurch besser optimieren.



  • @Badestrand:
    std::runtime_error macht garnix besonderes, Exceptions werden halt nicht sinnlos in der Gegend rumkopiert. Wenn du sie per value fängst wird halt der Copy-Konstruktor aufgerufen, auch klar, du fängst ja eine Kopie. Mit Slicing und allem was daran noch hässlich ist. Es wird aber sicher nie 3x der Destruktor aufgerufen obwohl nur 1x ein Objekt konstruiert wurde, das kannst du mir glauben. Zumindest nicht wenn der Compiler richtig arbeitet, und DAS haben die Compiler eigentlich so ziemlich alle raus -- sogar VC6 baut da keinen Mist.

    Und warum man oft das "catch by const-ref" statt "catch by non-const-ref" sieht liegt wohl daran dass es (anscheinend) compiler gibt oder gegeben hat die die Exception kopieren wenn man sie "by non-const-ref" fängt, oder sonstwie langsameren Code erzeugen.

    Und... poste mal nen Stück Code wo mehr als 1x der Destruktor aufgerufen wird, und ich sage dir dann was faul ist 😉


Anmelden zum Antworten