Start Info Community Spielen
 
 

Morgengrauner Dokumentation

Dateipfad: /home/mud/mudlib/doc//LPC/assert

NAME
        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

YOUTUBE | FACEBOOK | TWITTER | DISCORD | FEEDBACK | IMPRESSUM | DATENSCHUTZ 1992–2023 © MorgenGrauen.