| 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 Laufzeitfehlers (ob nun mit oder ohne catch()) auf |
| der anderen Seite ist sehr zeitintensiv. |
| |
| catch ist nicht im eigentlichen Sinne eine Efun, sondern eine Compiler |
| Anweisung. |
| |
| BEISPIEL |
| object obj; |
| string err; |
| if(err = catch(obj = clone_object("/foo/bar/baz"))) |
| write("Kann das Objekt nicht clonen. Grund: "+err+"\n"); |
| |
| AENDERUNGEN |
| 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) |