blob: 57c58aa3ac13b65aae71460537810c89697f35f4 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001SYNOPSIS
Zesstrad59c3892019-11-28 20:53:39 +01002 mixed catch(expr, expr, ...)
3 mixed catch(expr, expr, ...; modifiers)
MG Mud User88f12472016-06-24 23:31:02 +02004
5BESCHREIBUNG
6 Wertet die Ausdruecke <expr> aus. Wenn kein Fehler auftritt, wird 0
7 zurueck geliefert. Wenn ein Fehler auftritt, wird die Ausfuehrung an
8 diesem Punkt abgebrochen und ein String mit der Fehlermeldung wird
9 zurueck gegeben.
10
11 Systemeigene Fehlermeldungen beginnen mit einem "*", benutzerdefinierte
12 Fehlermeldungen aus throw() und raise_error() (sofern von 0
13 verschieden), werden unveraendert zurueck geliefert.
14
15 Wenn zum Zeitpunkt, zu dem catch() aufgerufen wird, weniger als
16 __CATCH_EVAL_COST__ Rechenticks uebrig sind, wird ein Laufzeitfehler
17 RTE innerhalb von catch() erzeugt (und somit wie jeder andere
18 Fehler abgefangen) und es werden keine Ausdruecke <expr> aus catch()
19 ausgewertet. Der Modifikator 'reserve' kann verwendet werden,
20 einen anderen Wert fuer die Reserve anzugeben.
21
22 Das Verhalten von catch() kann durch <modifiers> veraendert werden:
23
24 'nolog': Normalerweise wird der Fehler im Fehlerlog
25 gespeichert, um die Fehlersuche zu erleichtern. Wird
26 'nolog' gesetzt, wird dieser Log-Eintrag unterdrueckt.
27 'publish': Normalerweise wird master::runtime_error() fuer einen
28 Fehler innerhalb eines catch() nicht aufgerufen. Mit
29 diesem <modifier> wird runtime_error() trotzdem
30 aufgerufen.
31 'reserve <expr>': <expr> muss eine ganzen Zahl groesser 0
32 ergeben, welche dann als Rechenreserve anstelle
33 von __CATCH_EVAL_COST__ verwendet wird. Das Minimum
34 ist 2 * __MASTER_EVAL_COST__ .
35
36 catch() an sich ist nicht besonders laufzeit-intensiv: es braucht
Zesstrad59c3892019-11-28 20:53:39 +010037 nur etwas mehr Zeit als ein Intra-Objekt-Funktionsaufruf.
MG Mud User88f12472016-06-24 23:31:02 +020038
39 throw() ist ebenfalls nicht sehr teuer, da lediglich einige
40 interne Strukturen aufgeraeumt werden muessen.
41
Zesstrad59c3892019-11-28 20:53:39 +010042 Echte Laufzeitfehler (ob nun mit oder ohne catch()) sind hingegen
43 sehr zeitintensiv.
MG Mud User88f12472016-06-24 23:31:02 +020044
45 catch ist nicht im eigentlichen Sinne eine Efun, sondern eine Compiler
46 Anweisung.
47
Zesstrad59c3892019-11-28 20:53:39 +010048
49BEISPIELE
MG Mud User88f12472016-06-24 23:31:02 +020050 object obj;
51 string err;
52 if(err = catch(obj = clone_object("/foo/bar/baz")))
53 write("Kann das Objekt nicht clonen. Grund: "+err+"\n");
54
Zesstrad59c3892019-11-28 20:53:39 +010055GESCHICHTE
MG Mud User88f12472016-06-24 23:31:02 +020056 LDMud 3.2.9 fuehrte den 'nolog' catch() als experimentelles Feature
57 ein.
58 LDMud 3.2.10 implementierte 'nolog' als offizielle Form und fuehrte
59 zudem 'publish' ein.
60 LDMud 3.3.559 verlegte den Test auf verbleibende Rechenticks in die
61 vom catch() umschlossenen Ausfuehrung.
62 LDMud 3.3.560 fuegte den Modifikator 'reserve' ein.
63
64SIEHE AUCH
65 throw(E), raise_error(E), predefined(D), runtime_error(M)