[erledigt] Fehler ausgabe total umständlich?



  • Ich möchte einfach nur einen range_error erzeugen und in dem Parameter vom Fehlermeldungs-Konstructor beschreiben:
    - welche Variable
    - mit welchen Wert
    - welchen Bereich verlassen hat.

    In meinen Fall habe ich ein 2 demensionales Array welches ich mit einem std:vector simuliere. Nun habe ich eine Methode geschrieben die aus einer zweidemensionallen Positionsangabe die Position des Elementes in den eindemensionallen Array berechnet.
    Falls der Wert von x der nicht zwischen 0 und width-1 liegt moehte ich einen Fehler genieren. Die soll zum Beispiel so aussehen:

    x has the value 45, but it sould have a value between 0..42

    Ich darf das ja nicht so schreiben wie in java oder?

    throw new Fehlerklasse("x has value" + x + ", but it should have a value between 0.." + (width-1));
    

    oder gibt es eine Lösung die dieser in Pascal/Delphi realisieren ähnelt?

    raise Exception.create('x has value' + IntToStr(x) + ', but it should have a value between 0,,' + IntToStr(width-1));

    In beiden Sprachen kann ich mit einem Befehl den String generieren und das Ergebnis gleich dem Fehlemeldungs Konstructor überreichen. Geht das bei C++ auch, oder muss ich da auf eigene hilfs Funktionen zurueckgreifen?

    Habe nur diesen Eintrag im FAQ gefunden der erklaert wie man aus einem Integer einen String macht.

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39488.html

    MfG
    IFlo



  • nutze den std::ostringstream:

    #include <sstream>
    // ...
    if( Fehler )
    {
        std::ostringstream buf;
        buf << "x has value" << x << ", but it should have a value between 0.." << (width-1);
        throw std::range_error( buf.str() );
    }
    

    Gruß
    Werner



  • Werner Salomon schrieb:

    nutze den std::ostringstream:

    #include <sstream>
    // ...
    if( Fehler )
    {
        std::ostringstream buf;
        buf << "x has value" << x << ", but it should have a value between 0.." << (width-1);
        throw std::range_error( buf.str() );
    }
    

    Gruß
    Werner

    Also nein, es geht nicht mit einen Befehl?

    Hmm danke, dann muss ich es wohl so umstaendlich machen?

    MfG
    IFlo



  • Auch wenn ich nicht sehe dass std::ostringstream allzu umständlich ist könntest du dich evtl. für boost interessieren:
    boost::format
    boost::lexical_cast



  • danke finix, das war es was ich ursprünglich gesucht hatte!

    Habe mir jetzt aber zur Bereichs überprüfung folgendes (und erstes 🙂 )Template erstellt:

    template <typename T>
    void assertNotOutsideRange(const std::string name, const T value, const T from, const T to)
    {
    	if (value > to || value < from)
    	{
    		std::ostringstream buf;
    		buf << name << ": expected value between " << from << " and " << to << ", but get " << value;
    		throw std::range_error( buf.str() );
    	}
    }
    

    und rufe(??) es dann so auf:

    assertNotOutsideRange("x",x,0,width-1);
    	assertNotOutsideRange("y",y,0,height-1);
    

    Ob es nun richtig/gut war, da einen std:string als Parameter zu verwenden anstatt einem Char*, bin ich mir nicht ganz sicher. Damit das hier nicht Off-Topic wird fange, ich für diese Frage einen neuen Thread an. (Link)

    Danke nochmal an alle!

    MfG
    IFlo



  • und jetzt erklär nochmal, warum du hier ein template benutzt... 🙄



  • Damit ich sie auch mit int, double, float und evt. eigenen Objekten auch verwenden kann. Und sie nicht 5 mal überladen muss. Spricht den was dagegen?

    MfG
    IFlo


Anmelden zum Antworten