Exception richtig abfangen?



  • Hallo!

    Ich kenne mich leider noch nicht gut in Bereich Exceptions aus daher hoffe ihr könnt mir weiterhelfen.

    Ich bei einen Kritischen Fehler Errorcodes vor den Schließen ausgeben jetzt dachte ich kann das an besten mit Exception lösen.

    Und zwar in meiner Klasse werfe ich eine Exception mit einen Ganzahl wert und den will ich dann in main abfangen und dann den jeweiligen return Code(Errorcode) ausgeben.

    Es funktioniert zwar ich bekomme aber folgenden Fehler unter(Visula c++)

    Eine Ausnahme (erste Chance) bei 0x7651f328 in Assignment2.exe: Microsoft C++-Ausnahme: int an Speicherposition 0x0038f7b8..

    Was auf einen etwas unsauberen Speicher zugriff deutet oder?
    Und ob es überhaut schlau ist eine Ganzahl zu werfen mit Exceptions ist auch etwas unsauber oder?

    Wie schon gesagt ich kenne mich nicht aus mit Execeptions! Ich hoffe ihr könnt mir weiterhelfen, wenn es geht mit Codebeispiele.

    mfg



  • Du musst deine geworfenen Exceptions fangen, sonst bringen sie das Programm zum Absturz. Daher rührt auch dein Fehler. 😉

    Mittels try und catch kannst du Exceptions behandeln. Ein mögliches Beispiel:

    int main()
    {
        try // Code, bei dem Exception auftreten kann, mit try umschliessen
        {
            throw 352; // Exception werfen
        }
        catch (int i) // danach mittels catch Fehlerbehandlungscode einfügen - hier für Exception vom Typ int
        {
            std::cout << "Ein Fehler ist aufgetreten. Fehlernummer: " << i << std::endl;
            return i;
        }
    }
    

    In diesem Artikel findest du eine etwas ausführlichere Einführung in Exception-Handling.



  • vielleicht kriegst du das nur vom debugger. wenn du deine exe allein ausführtst, klappt dann alles?



  • Also in Grunde genommen funktioniert es ja weil es wird der Richtige Errorcode ausgegeben! Je nachdem welcher Ganzzahlenwert geworfen wurde!

    Aber es kommt halt dieser Fehler!

    Das Problem ist halt das ich irgendwo in einer Methode einer Klasse ein throw mache und diese Exception erst in der main abfange.

    Muss ich vielleicht die Exception irgendwie weiterreichen bis ich zu mein komme?



  • Dieser Thread wurde von Moderator/in volkard aus dem Forum C++ in das Forum MFC (Visual C++) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • ups vertippt main = mein 😉



  • _exception schrieb:

    Muss ich vielleicht die Exception irgendwie weiterreichen bis ich zu mein komme?

    Nein, sie fliegt, solange du sie nicht fängst. Wenn dieser Errorcode ausgegeben wird, hast du sie eben nicht gefangen. Zeige ansonsten ein wenig Code. Gut wäre so wenig wie möglich, aber dass das Problem trotzdem reproduziert wird.



  • @_exception:
    Deutsch lernen, Deutsch lernen, Deutsch lernen, Deutsch lernen.
    Tip: Bücher lesen hilft ein wenig, und macht mehr Spass als büffeln.



  • hustbaer schrieb:

    @_exception:
    Deutsch lernen, Deutsch lernen, Deutsch lernen, Deutsch lernen.
    Tip: Bücher lesen hilft ein wenig, und macht mehr Spass als büffeln.

    Da haben mich andere posts (und deren Schreibfehler) schon wesentlich mehr genervt.

    Etwas mehr Toleranz?



  • EOP schrieb:

    Etwas mehr Toleranz?

    War was ich geschrieben habe denn so schlimm?
    Oder findest du dass das Kopfposting grösstenteils leicht lesbare und gut verständliche Sätze enthält? Es geht mir nicht um korrekt, es geht mir bloss darum, dass ich nicht 3x über einen Satz drüberlesen mag, bis ich verstanden habe, was gemeint ist.

    Und was meinst du mit Toleranz? Ist Toleranz gleichbedeutend mit "man darf kein Kommentar dazu abgeben"?



  • _exception schrieb:

    Es funktioniert zwar ich bekomme aber folgenden Fehler unter(Visula c++)

    Eine Ausnahme (erste Chance) bei 0x7651f328 in Assignment2.exe: Microsoft C++-Ausnahme: int an Speicherposition 0x0038f7b8..

    Was auf einen etwas unsauberen Speicher zugriff deutet oder?

    Der Debugger von Visual Studio gibt diese Meldung immer dann aus, wenn irgendwo eine Exception mit "throw" geworfen wird. Die Meldung ist bloss eine Hilfestellung, für Fälle, wo es nützlich ist zu wissen, was für Exceptions geworfen werden - auch wenn diese korrekt gefangen und behandelt werden. Es handelt sich also nicht um einen Fehler, und es deutet auch nicht darauf hin, dass irgendwas "unsauber" ist.

    Sollte die Exception nirgendwo gefangen werden, dann reagiert der Debugger etwas heftiger: er unterbricht die Ausführung des Programms, und zwar an der Stelle, wo die Exception geworfen wird.

    Allerdings ist nichtmal das unbedingt immer als "schlecht" anzusehen: es gibt Fälle, wo genau das die beste Möglichkeit ist, ein Programm zu beenden.

    Und ob es überhaut schlau ist eine Ganzahl zu werfen mit Exceptions ist auch etwas unsauber oder?

    Nö, finde ich nicht schlau. Es gibt in der Standard-Library fertige Exception-Klassen, die man dazu verwenden kann. Beispiel:

    #include <stdexcept>
    #include <iostream>
    
    void test2()
    {
        std::cout << "Anfang test2\n";
        throw std::runtime_error("Fehler in test2");
        std::cout << "Ende test2\n";
    }
    
    void test()
    {
        std::cout << "Anfang test\n";
        test2();
        std::cout << "Ende test\n";
    }
    
    int main()
    {
        try
        {
            test();
            return 0; // alles OK
        }
        catch (std::exception const& e)
        {
            std::cout << "Error:\n"
                << "  Type: " << typeid(e).name() << "\n"
                << "  Message: " << e.what() << "\n";
    
            return 1; // Fehler
        }
    }
    


  • Nexus schrieb:

    Wenn dieser Errorcode ausgegeben wird, hast du sie eben nicht gefangen.

    Er. Nein. Dieser Text wird immer ausgegeben, wenn irgendwo eine Exception geworfen wird. Auch wenn diese dann ganz korrekt gefangen wird.

    Guggstu: http://blogs.msdn.com/davidklinems/archive/2005/07/12/438061.aspx



  • Ok! Danke für die Hilfe!! 👍



  • hustbaer schrieb:

    EOP schrieb:

    Etwas mehr Toleranz?

    War was ich geschrieben habe denn so schlimm?
    Oder findest du dass das Kopfposting grösstenteils leicht lesbare und gut verständliche Sätze enthält? Es geht mir nicht um korrekt, es geht mir bloss darum, dass ich nicht 3x über einen Satz drüberlesen mag, bis ich verstanden habe, was gemeint ist.

    Und was meinst du mit Toleranz? Ist Toleranz gleichbedeutend mit "man darf kein Kommentar dazu abgeben"?

    Eigentlich hast du ja Recht.

    Mich nerven die Legastheniker-posts auch regelmäßig...


Anmelden zum Antworten