Warum kein assert in boost::array operator[]
-
Wieso brauchst du das? Im Idealfall bringt dich die Assertiation doch in die entsprechende Codezeile.
-
kingruedi schrieb:
(int 3 oder exception)
und statt oder
finde ich es vorallem nützlich noch eine Textinformation mitgeben zu können
solange es kein std::string ist. kann mir immer nochz nocht erklären, was die leute gedacht haben, als sie std::exception mit std::string implementiert haben. sollen jetzt meine WinException mit dem int aus GetLastError drin den text mit FormatMessage auslesen und gleich in den std::string schreiben. nee. ist schwach. lieber erst beim anzeigen. und dann führe ich immer in der basisklasse nen nutzlosen string mit.
damit man den Fehler gleich erklärt. Ein "assertion failed i<3" ist ja nicht unbedingt verständlich
die netten "Datei konnte nicht geöffnet werden" aus win sind normalerweise zufriedenstellend. ganz extravagant wäre es noch, den dateinamen mitzugeben.
aber i<3-fehler können eigentlich so stehen bleiben ohne text. die muss man ja eh mit dem debugger angucken und sie sind schneller weggemacht als hingemacht. und finden sich im code von heute oder gestern.
-
Das muss man ein wenig aufputschen. Neben dem, was du bereits vorgeschlagen hast (int 3 oder exception), finde ich es vorallem nützlich noch eine Textinformation mitgeben zu können, damit man den Fehler gleich erklärt. Ein "assertion failed i<3" ist ja nicht unbedingt verständlich
Na wenns dir so wies jetzt ist nicht reicht, dann kannst es doch so benutzen:
#include <cassert> void f() { int i = 5; std::assert(i != 5 && "i ist nicht gleich 5"); }
Konsole:
Assertion failed: i != 5 && "i ist nicht gleich 5", file ..., line ...Ist zwar nicht die schönste möglichkeit, wird aber
sowieso nur beim debuggen benutzt.Tankian
-
@MaSTaH
ist vorallem dann sinnvoll, wenn das assert in Code ist, den man nicht selbst geschrieben hat oder wo es lange her ist, dass man den geschrieben hat. Dann weiß man eben sofort, was genau los ist und wie man das umgehen könnte.
-
volkard schrieb:
solange es kein std::string ist. kann mir immer nochz nocht erklären, was die leute gedacht haben, als sie std::exception mit std::string implementiert haben. sollen jetzt meine WinException mit dem int aus GetLastError drin den text mit FormatMessage auslesen und gleich in den std::string schreiben. nee. ist schwach. lieber erst beim anzeigen. und dann führe ich immer in der basisklasse nen nutzlosen string mit.
?
18.6.1 Class exception
namespace std {
class exception {
public:
exception() throw();
exception(const exception&) throw();
exception& operator=(const exception&) throw();
virtual ~exception() throw();
virtual const char* what() const throw();
};
} The class exception defines the base class for the types of objects thrown as exceptions by C++ Standard library components, and certain expressions, to report errors detected during program execution.Wo std::exception da ein std::string rumschleppt ist mir rätzelhaft.
-
Ben04 schrieb:
Wo std::exception da ein std::string rumschleppt ist mir rätzelhaft.
und ich habe immer geglaubt, da sein einer drin. danke für die aufkärung. das freut mich, ich werde meine exceptions also fein von std:.exception erben lassen können.
-
std::runtime_error hat wohl intern einen String
-
zum cooleren. es sollte im release-mode einfach das gleiche wie assert machen. also nix. und im debug-mode sollte es ne exception werfen. das garantier, dass evtl ressourcen, dei echt unbedingt geschlossen werden müssen, auch zu gehen. ich mach in mein ASSERT auch ein "__asm int 3" rein, dann geht der debugger genau in der zeile auf, wo das ASSERT steht.
Wie du ja bereits gesagt hast, kannst dir ja selbst schreiben. Soweit ich weiß
war std::logic_error sogar dafür gedacht, assert irgendwie ersetzen zu können.
Blöd is es nur wenn solche Fehlermeldungen bei einem catch(...) untergehen ..
-
volkard schrieb:
jo, ich war nicht da.
assert() ist böse.Rumbasteln könnte man aber auch, wenn assert() als Standard vorgegeben wäre - und dann könnte man per search&replace auch viel komfortabler sein eigenes assert reinschmuggeln. Es ist ja nicht nur op[], den man falsch benutzen kann.
Ich bleib bei der traurigen ODR-Theorie