Morgengrauner Dokumentation
Dateipfad: /home/mud/mudlib/doc//LPC/assertNAME
assert
SYNTAX
assert (expr, msg)
DESCRIPTION
Wenn man ein Programm schreibt, ist es oft eine gute Idee, an
wichtigen Stellen Pruefungen auf grundlegende Annahmen (oder
"unmoegliche" Fehlerzustaende) zu formulieren.
Beispiele hierfuer koennten Pruefungen darauf sein, ob an eine
Funktion die richtigen Daten uebergeben wurden oder aus einer Property
die richtige Datenstruktur ausgelesen wurde oder ob eine Annahme
stimmt, von der die Magierin ausgeht und die wichtig ist fuer den
weiteren Ablauf.
Das 'assert'-Makro ist eine bequeme Moeglichkeit, solche Pruefungen
zu formulieren, welche an dieser Stelle einen Laufzeitfehler
ausloesen, falls unwahr sein sollte. Oder anders: es dient
dazu, die Annahme der Magierin zu pruefen, dass in diesem
Moment != 0 ist.
In der Fehlermeldung wird in diesem Fall die aktuelle Datei, Zeile,
ggf. Funktion und die vom Magier formulierte ausgegeben.
Sollte einem nichts sinnvolles einfallen, schreibt einfach man einen
String mit der rein.
Hierbei sollte man aber bedenken, ob es an dieser Stelle gut ist, die
Programmausfuehrung hart abzubrechen oder es notwendig sein koennte,
zunaechst "aufzuraeumen", um inkonsistente Zustaende spaeter zu
vermeiden. assert() sollte nur verwendet werden, wenn der Abbruch der
Programmausfuehrung an dieser Stelle eine *sinnvolle* Reaktion auf den
Fehlerzustand ist.
Es ist moeglich, dass assert() in ein catch(...;publish) zu
formulieren, um eine Fehlermeldung zu produzieren, aber die
Ausfuehrung fortzusetzen. Aber auch bitte ueberlegen, ob das sinnvoll
ist.
Das Makro ist in dem Systemheader definiert, welche also
zuvor inkludiert werden muss.
Es ist moeglich, in einem File alle assert() auf einmal abzuschalten,
indem vor dem Inkludieren von das Define NDEBUG definiert
wird (egalf auf welchen Wert). Das hat den Vorteil, dass man sie
spaeter (z.B. zum Debuggen) schnell wieder einschalten kann.
Der Ausdruck sollte *keinerlei* Seiteneffekte haben. Dies ist
speziell wichtig, wenn NDEBUG spaeter gesetzt wird, weil in dem Fall
auch der Seiteneffekt nicht mehr stattfindet: wird dann gar
nicht mehr ausgewertet. Beispielsweise ist assert (++i > 0); oder
assert (data = QueryProp(FOO)); eine sehr schlechte Idee.
Ohnehin waeren Ausdruecke mit Seiteneffekt sehr schlechter Stil.
EXAMPLE
// Pruefung auf Vorraussetzungen einer Funktion
// Eine Funktion zum Bezahlen von Geld verlaesst sich darauf, dass sie
// nur mit positiven Werten gerufen wird. Wenn jemand sie mit
// negativen Werten ruft, kommt Unsinn dabei raus.
void pay(int money) {
assert(money > 0, "Negativen Betrag erhalten");
...
// Bemerkung: man sollte keine Benutzereingaben mit assert() pruefen!
// Eine Funktion darf nur in leeren Raeumen gerufen werden und geht
// auch davon aus, dass der Raum leer ist:
int dispose_me() {
assert(!sizeof(all_inventory()); "Raum nicht leer!");
remove(1);
}
SEE ALSO
raise_error(E), throw(E)
zurück zur Übersicht