catch(CC& a) statt catch(CC a)



  • Hallo alle!
    Ich habe da eine Verständnissfrage: Ich werfe ein

    std::out_of_rang("foo bar")
    

    und muss es mit

    catch(std::exception& e)
    

    fangen damit ich

    std::cout<<e.what()
    

    machen kann.

    Wenn ich mit

    catch(std::exception e)
    

    fange sollte das Objekt doch lediglich kopiert werden und alles bleibt beim alten. Bei

    std::cout<<e.what()
    

    bekomme ich dann aber St9exception.

    Was ist das Problem? Haut das kopieren bei Exceptions nicht hin, oder funktioniert die Polymorphiegeschichte nicht wenn ich das Objekt erst kopieren lasse?

    Vielen Dank!

    Bis dann...
    Peanut



  • Polymorphie funktioniert nur mit Referenzen und Zeigern.



  • Hallo,
    du wurdest Opfer des berühmt berüchtigten Object-Slicings.

    Wenn du eine Exception by value fängst, dann wird die Exception *kopiert*.
    Kopieren passiert in C++ über den Copy-Konstruktor. In diesem Fall wird der Copy-Ctor von std::exception aufgerufen. Dieser initialisiert aber natürlich auch nur ein Objekt vom Typ std::exception.

    Bei diesem Kopiervorgang wird in diesem Fall also nur der Basisklassenanteil der geworfenen Exception kopiert und übernommen. Du hast danach eine Exception vom Typ std::exception. Und zwar wirklich von diesem Typ. Von dem abgeleiteten Teil ist *nichts* mehr übrig. Weg. Abgeschnitten.

    Deshalb merke:
    Regel Nr. 27 für das Hantieren mit Exceptions in C++:
    "Throw by value, catch by reference".


Anmelden zum Antworten