standard exceptions



  • Hi

    Mal ne Frage: Soweit ich weiß werden doch exceptions geworfen, wenn ich irgendwas Böses mache, also z.B. einen Speicherbereich überschreite, oder sowas. Aber wie komme ich an diese standard exceptions ran? Ich hab mal

    try
    {
    ... tu etwas Böses
    }
    catch (exception &e)
    {
    ...
    }

    gemacht und dann den Bereich von nem String häftig überschritten. Das Programm ist zwar abgeschmiert, hat aber keine exception registriert.
    Dann hab ich da noch die "bad_exception" in der MSDN gefunden, die scheint aber in <exception.h> nicht definiert zu sein und ansonsten hab ich keine andere header, die in Betracht käme.

    Irgendwelche Ideen, wie ich da ran komme?

    Jan.



  • hast du den string mit operator[] oder mit at? nur at macht eine bereichsprüfung und wirft "out_of_range" aus stdexception
    achja, nur bitset<>::operator[] darf auch ein out_of_range werfen.

    std::bad_exception ist etwas anderes.
    bsp:

    #include <exception>
    class X {}; class Y {};
    
    void foo () throw (X) {
        throw Y();
    }
    
    void bar () throw (X, std::bad_exception) {
        throw Y();
    }
    

    bei einem aufruf von foo ruft std::unexpected() terminate() auf.
    bei einem aufruf von bar wirft std::unexpected einfach eine std::bad_exception und beendet das programm nicht. allerdings gehen alle informationen über die tatsächlich geworfene ausnahme verloren.
    das war std::bad_exception.

    bei operator[] wird aber einfach wild herumgeschrieben (memory fun ;))

    edit: smilies off

    [ Dieser Beitrag wurde am 19.04.2003 um 00:23 Uhr von davie editiert. ]

    edit2: Fehler: der header heißt nicht stdexception sondern stdexcept.

    [ Dieser Beitrag wurde am 19.04.2003 um 00:37 Uhr von davie editiert. ]

    edit3: nach jedem edit muss man die smilies wieder aussschalten...

    [ Dieser Beitrag wurde am 19.04.2003 um 00:38 Uhr von davie editiert. ]

    edit4: tschuldigung, std::bad_exception ist natürlich in <exception>
    mich hat das beispiel "out_of_range" verwirrt. out_of_range befindet sich in stdexcept

    [ Dieser Beitrag wurde am 19.04.2003 um 00:58 Uhr von davie editiert. ]



  • Original erstellt von davie:
    **

    #include <stdexception>
    

    **

    <exception>
    

    Ist heute nicht Dein Tag was Headernamen betrifft, oder? 😉

    [ Dieser Beitrag wurde am 19.04.2003 um 00:27 Uhr von nman editiert. ]



  • <stdexcept>



  • hups, so spät hätt ich mir so schnell keine reaktionen gedacht...
    ich meinte <stdexcept> 😉
    und den stdlib fehler hab ich absichtlich gemacht um zu sehen, wer als erster draufkommt 😃
    danke für die korrekturen 🙂



  • Klar, hatte ich mir doch gleich gedacht! 😉

    Aber wozu denn <stdexcept>? Wenn Du nur mal eine bad_exception werfen möchtest reicht auch exception, da sollte IMO bad_exception nämlich deklariert sein.



  • ja, std::bad_exception ist in exception...

    mich hat das bsp mit dem string anscheinend verwirrt...
    std::out_of_range ist nämlich in stdexcept...
    ist schon spät 😃

    [ Dieser Beitrag wurde am 19.04.2003 um 00:58 Uhr von davie editiert. ]



  • Also ich mach folgendes:

    try
    {
    char a[1];
    strcpy (a, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
    }
    catch (std::bad_exception &e)
    {
    ...
    }
    catch (std::out_of_range &e)
    {
    ...
    }
    catch (exception &e)
    {
    ...
    }

    Das Programm ärgert sich zwar, erkennt den Fehler aber als keine dieser Exceptions.

    Und da noch eine andere Frage: Soweit ich weiß sollte ein catch-Block eine Exception auch dann fangen, wenn der Typ im catch-Block die Basisklasse der geworfenen Exception ist.
    Das würde bedeuten, dass mein catch (exception) doch eigentlich sämtliche Exceptions abfangen müsste, weil bad_alloc etc. ja davon abgeleitet sind, oder?
    Es scheint aber nicht so zu sein.

    Ach ja, ich benutze VC++ .NET, falls das wichtig dafür sein sollte.

    Jan.



  • es wird keine exception geworfen!



  • da du MSDN sagst, biste wohl mit dem MSVC unterwegs? da kannste vermutlich mit catch(...) sogar schutzverletzungen fangen oder machst es ordentlich mit SEH.


Anmelden zum Antworten