Try Catch Frage



  • d.h. man kann std::exception nicht direkt verwenden?



  • ssm schrieb:

    es ist leder nicht portabel, da std::string keinen constructor hat, der const char* nimmt:

    Das war nicht "nicht portabel", das war schlichtweg falsch.
    std::string hat übrigens einen Konstruktor für const char*, std::exception hingegen nicht. :p

    Aber dann verwendet man einfach std::runtime_error oä, ist ja auch eine std::exception.



  • simon.phoenix schrieb:

    d.h. man kann std::exception nicht direkt verwenden?

    genau



  • Wie bereits gesagt: runtimer_error, logic_error und Co. verschaffen Abhilfe.



  • Hmm,
    gar nicht mal so einfach.
    noch mal zum Verständnis:

    catch(exception &ex)
    	{
    		cerr<<ex.what();
    	}
    

    Wo stehen jetzt die informationen über meine Excetion?



  • bigborre schrieb:

    Hmm,
    gar nicht mal so einfach.
    noch mal zum Verständnis:

    catch(exception &ex)
    	{
    		cerr<<ex.what();
    	}
    

    Wo stehen jetzt die informationen über meine Excetion?

    in cerr



  • hmm, ja logisch 😃 😃
    Manchmal sieht man den Wald vor Bäumen nicht.



  • Ok, ich hab jetzt die Infos zur Exception in cerr.
    Kann ich das jetzt in einen String umwandeln?

    char buffer[200]:
    sprintf(buffer, cerr);
    

    dachte ich, funktioniert aber nicht.



  • bigborre schrieb:

    Ok, ich hab jetzt die Infos zur Exception in cerr.
    Kann ich das jetzt in einen String umwandeln?

    char buffer[200]:
    sprintf(buffer, cerr);
    

    dachte ich, funktioniert aber nicht.

    😃

    catch(const exception &ex)
    {
    std::string errorMessage(ex.what());
    }



  • ???

    hä, wie funktioniert das?
    wo steht dann mein String drin?



  • Im std::string errorMessage. Da wurd dem Konstruktor der Rückgabewert von what() übergeben.



  • ok, ich glaub ich bin dafür zu blöd, angenommen ich möchte ex.what() in einen sting speichern und ausgeben, wie geht das

    sting s;
    .
    .
    .
    catch(exception &ex)
    {
    string=ex.what();
    cout<<s<<endl;
    }
    

    so?



  • bigborre schrieb:

    so?

    ja, aber wozu brauchst du noch sting s?
    einfach so geht eigentlich auch:

    catch(const exception &ex)
    {
      cout << ex.what() << endl;
    }
    


  • nein, es muss heißen:

    string s;
    .
    .
    .
     try
    {}
    catch(exception &ex)
    {
       s = ex.what();
       //oder, das was äquivalent ist nur halt schneller geht:
       string exception (ex.what()); // Aufruf des Konstruktors von string und
       // Erzeugung von "exception" -> in exception steht die Fehlermeldung
       cout << s << endl; //oder
       cout << exception << endl;
    }
    


  • Ok, mein eigentliches Problem, der Fehler soll in einer Messagebox ausgegeben werden

    catch(exception& ex)
    	{
    		ex.what();
    		MessageBox( NULL, ex.what(),"Fatal Error" , MB_OK );
    
    	}
    

    Alles funktioniert, bloß bei dem zweiten Parameter bringt er mir immer einen Fehler.

    EDIT: @viande so geht es auch nicht, in exception steht kein String.



  • [quote="bigborre"]Alles funktioniert, bloß bei dem zweiten Parameter bringt er mir immer einen Fehler.
    /quote]

    und so:

    [cpp]catch(const exception& ex)
    {
    ::MessageBoxA( NULL, ex.what(), "Fatal Error" , MB_ICONERROR );
    }[/cpp]

    ?

    man braucht die Fehlermeldung, um etwas genaues zu sagen



  • Ne, hat nix gebracht hier mal die fehlermeldung:

    error C2664: 'MessageBoxA' : Konvertierung des Parameters 2 von 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' in 'const char *' nicht moeglich
    

    Vielleicht weil ich ohne Klassen arbeite?



  • Nein, sondern weil WinAPI C ist und const char * erwartet, du aber mit std::string arbeitest. Deshalb musst du noch string::c_str() aufrufen, um den String umzuwandeln.

    ex.what().c_str();
    


  • bigborre schrieb:

    Ne, hat nix gebracht hier mal die fehlermeldung:

    error C2664: 'MessageBoxA' : Konvertierung des Parameters 2 von 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' in 'const char *' nicht moeglich
    

    Vielleicht weil ich ohne Klassen arbeite?

    😃

    [cpp]string s;
    .
    .
    .
    try
    {
    }
    catch(exception &ex)
    {
    s = ex.what();

    ::MessageBoxA( NULL, s.c_str(), "Fatal Error" , MB_ICONERROR );
    }[/cpp]



  • Michael E. schrieb:

    Nein, sondern weil WinAPI C ist. Deshalb musst du noch string::c_str() aufrufen.

    (ex.what()).c_str();
    

    👎

    [cpp]namespace std
    {
    class exception
    {
    virtual **const char ***what()
    {
    }
    };
    }[/cpp]


Anmelden zum Antworten