Try Catch Frage



  • 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]



  • ssm: Sorry, hab nur auf die Fehlermeldung geguckt. Aber wenn er einen Umweg über std::string macht, dann stimmts ja wieder 😃

    std::string(ex.what()).c_str();
    


  • @ ssm hab es probiert, es klappt aber immer noch nicht, dafür hat sich jetzt die Fehlermeldung verändert

    C2664: 'MessageBoxA' : Konvertierung des Parameters 2 von 'const char *(void) const' in 'const char *' nicht moeglich
    

    Mir raucht echt schon die Birne.



  • weil du so geschrieben hast:
    [cpp]::MessageBoxA( NULL, s.c_str, "Fatal Error" , MB_ICONERROR );[/cpp]

    du hast () vergessen.
    versuch noch mal:

    ::MessageBoxA( NULL, s.c_str(), "Fatal Error" , MB_ICONERROR );
    


  • Hab jetzt ne Läsung gefunden, hoffe mal das kein Datenverlust auftritt, aber ich denke nicht, es kommt keine Warnung, vielen Dank für die ausdauernde Unterstützung 👍 👍 👍
    Ach ja hier meine Lösung:

    catch(const exception &ex)
    	{
    		sprintf(buffer,ex.what());
    		::MessageBoxA(NULL, buffer, "Fatal Error", MB_ICONERROR);
    	}
    

    funktioniert auch so

    catch(const exception &ex)
    	{
    		sprintf(buffer,ex.what());
    		MessageBox(NULL, buffer, "Fatal Error", MB_ICONERROR);
    	}
    


  • @ ssm du hast recht die klammern ham gefehlt, werd ich so machen , sprintf ist ja auch nicht gerade elegant Dank dir



  • bigborre schrieb:

    Hab jetzt ne Läsung gefunden, hoffe mal das kein Datenverlust auftritt, aber ich denke nicht, es kommt keine Warnung, vielen Dank für die ausdauernde Unterstützung 👍 👍 👍
    Ach ja hier meine Lösung:

    catch(const exception &ex)
    	{
    		sprintf(buffer,ex.what());
    		::MessageBoxA(NULL, buffer, "Fatal Error", MB_ICONERROR);
    	}
    

    funktioniert auch so

    catch(const exception &ex)
    	{
    		sprintf(buffer,ex.what());
    		MessageBox(NULL, buffer, "Fatal Error", MB_ICONERROR);
    	}
    

    soll auch so funktionieren:

    catch(const exception &ex)
    {
     sprintf(buffer,ex.what());
     MessageBox(NULL, ex.what(), "Fatal Error", MB_ICONERROR);
    }
    

Anmelden zum Antworten