MFC Exceptions



  • Hallo!

    Warum wirf die MFC Ausnahmen im Stil von

    throw new CException(...);
    

    , sodass der Anwender diese

    catch(Exception * pException)
    {
        pException->DoSomething();
        delete pException;
    }
    

    fangen muss und auch ans Löschen denken muss. Also es wird immer dynamisch Speicher für die Ausnahme geholt und als Pointer geworfen. Die STL hingegen macht das ganze ohne new

    throw std::exception(...);
    

    Georg



  • Die MFC wirft ihre Exceptions als Pointer weil das auch über DLL Grenzen hinweg funktioniert.

    Typischerweise ist die Exception direkt als Objekt zu werfen.

    Simon



  • theta schrieb:

    Die MFC wirft ihre Exceptions als Pointer weil das auch über DLL Grenzen hinweg funktioniert.

    Typischerweise ist die Exception direkt als Objekt zu werfen.

    Simon

    Ok, danke für die Info.


  • Mod

    Der eigentliche Grund ist ein anderer.
    Die MFC hat bereits ein Exception Schema verwendet als der C++ Standard noch lange nicht festgelegt hatte wie Exceptions zu behandeln sind. Es gab in diesem System ein TRY / CATCH / CATCH_ALL Makros, die auch noch heute vorhanden sind.

    Dieser alte Mechanismus basierte auf setjmp/longjmp Funktionen der CRT und musste intern Pointer verwenden.
    Der einfach halt halber hat deshalb das CException Objekt eine Delete Methode bekommen, die kontrollierte ob es ein dynamisches oder gar statisches Objekt ist, das es zu entsorgen oder zu ignorieren gilt.

    Und durch diese "frühe Design Entscheidung" wirft die MFC heute noch Zeiger.

    Ja, ja.. Zeiten ändern sich, aber mancher Code nie.



  • @Martin: Danke für die Info.
    Simon


Anmelden zum Antworten