blob: c436b7da030b6f98ac24800b083560808f6d10e1 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001SYNOPSIS
2 mixed catch(expr, expr, ...);
3 mixed catch(expr, expr, ...; modifiers);
4
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
37 nur etwas mehr Zeit als ein Intra-Objekt Funktionsaufruf.
38
39 throw() ist ebenfalls nicht sehr teuer, da lediglich einige
40 interne Strukturen aufgeraeumt werden muessen.
41
42 Echte Laufzeitfehlers (ob nun mit oder ohne catch()) auf
43 der anderen Seite ist sehr zeitintensiv.
44
45 catch ist nicht im eigentlichen Sinne eine Efun, sondern eine Compiler
46 Anweisung.
47
48BEISPIEL
49 object obj;
50 string err;
51 if(err = catch(obj = clone_object("/foo/bar/baz")))
52 write("Kann das Objekt nicht clonen. Grund: "+err+"\n");
53
54AENDERUNGEN
55 LDMud 3.2.9 fuehrte den 'nolog' catch() als experimentelles Feature
56 ein.
57 LDMud 3.2.10 implementierte 'nolog' als offizielle Form und fuehrte
58 zudem 'publish' ein.
59 LDMud 3.3.559 verlegte den Test auf verbleibende Rechenticks in die
60 vom catch() umschlossenen Ausfuehrung.
61 LDMud 3.3.560 fuegte den Modifikator 'reserve' ein.
62
63SIEHE AUCH
64 throw(E), raise_error(E), predefined(D), runtime_error(M)