SYNOPSIS
mixed catch(expr, expr, ...)
mixed catch(expr, expr, ...; modifiers)
BESCHREIBUNG
Wertet die Ausdruecke <expr> aus. Wenn kein Fehler auftritt, wird 0
zurueck geliefert. Wenn ein Fehler auftritt, wird die Ausfuehrung an
diesem Punkt abgebrochen und ein String mit der Fehlermeldung wird
zurueck gegeben.
Systemeigene Fehlermeldungen beginnen mit einem "*", benutzerdefinierte
Fehlermeldungen aus throw() und raise_error() (sofern von 0
verschieden), werden unveraendert zurueck geliefert.
Wenn zum Zeitpunkt, zu dem catch() aufgerufen wird, weniger als
__CATCH_EVAL_COST__ Rechenticks uebrig sind, wird ein Laufzeitfehler
RTE innerhalb von catch() erzeugt (und somit wie jeder andere
Fehler abgefangen) und es werden keine Ausdruecke <expr> aus catch()
ausgewertet. Der Modifikator 'reserve' kann verwendet werden,
einen anderen Wert fuer die Reserve anzugeben.
Das Verhalten von catch() kann durch <modifiers> veraendert werden:
'nolog': Normalerweise wird der Fehler im Fehlerlog
gespeichert, um die Fehlersuche zu erleichtern. Wird
'nolog' gesetzt, wird dieser Log-Eintrag unterdrueckt.
'publish': Normalerweise wird master::runtime_error() fuer einen
Fehler innerhalb eines catch() nicht aufgerufen. Mit
diesem <modifier> wird runtime_error() trotzdem
aufgerufen.
'reserve <expr>': <expr> muss eine ganzen Zahl groesser 0
ergeben, welche dann als Rechenreserve anstelle
von __CATCH_EVAL_COST__ verwendet wird. Das Minimum
ist 2 * __MASTER_EVAL_COST__ .
catch() an sich ist nicht besonders laufzeit-intensiv: es braucht
nur etwas mehr Zeit als ein Intra-Objekt-Funktionsaufruf.
throw() ist ebenfalls nicht sehr teuer, da lediglich einige
interne Strukturen aufgeraeumt werden muessen.
Echte Laufzeitfehler (ob nun mit oder ohne catch()) sind hingegen
sehr zeitintensiv.
catch ist nicht im eigentlichen Sinne eine Efun, sondern eine Compiler
Anweisung.
BEISPIELE
object obj;
string err;
if(err = catch(obj = clone_object("/foo/bar/baz")))
write("Kann das Objekt nicht clonen. Grund: "+err+"\n");
GESCHICHTE
LDMud 3.2.9 fuehrte den 'nolog' catch() als experimentelles Feature
ein.
LDMud 3.2.10 implementierte 'nolog' als offizielle Form und fuehrte
zudem 'publish' ein.
LDMud 3.3.559 verlegte den Test auf verbleibende Rechenticks in die
vom catch() umschlossenen Ausfuehrung.
LDMud 3.3.560 fuegte den Modifikator 'reserve' ein.
SIEHE AUCH
throw(E), raise_error(E), predefined(D), runtime_error(M)
|