MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | SYNOPSIS |
| 2 | mixed catch(expr, expr, ...); |
| 3 | mixed catch(expr, expr, ...; modifiers); |
| 4 | |
| 5 | BESCHREIBUNG |
| 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 | |
| 48 | BEISPIEL |
| 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 | |
| 54 | AENDERUNGEN |
| 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 | |
| 63 | SIEHE AUCH |
| 64 | throw(E), raise_error(E), predefined(D), runtime_error(M) |