[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ß
WernerAlso 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