Fehlerbehandlung
Auch wenn das Problem der Fehlerbehandlung nicht ausschließlich spezifisch für benutzerdefinierte Funktionen ist, so ist das Abfangen bzw. das "kontrollierte" Ende einer Ausführungseinheit innerhalb einer Funktion von zentraler Wichtigkeit. Allgemein werden in XQuery drei Arten von Fehlern erkannt:
- Statische Fehler ("static error")
Ein statischer Fehler muss während der Analysephase, d. h. zur Übersetzungszeit des XQuery-Ausdrucks, erkannt werden. Prominentes Beispiel eines statischen Fehlers ist ein Syntaxfehler. - Dynamische Fehler ("dynamic error")
Ein dynamischer Fehler wie beispielsweise eine Division durch null kann bereits in der Analysephase, muss aber spätestens in der Ausführungsphase, d. h. zur Laufzeit einer Anfrage, erkannt werden. - Typfehler ("type error")
Typfehler werden sowohl während der Übersetzungs- als auch während der Ausführungszeit erkannt und zeugen davon, dass ein Typ eines Ausdrucks nicht kompatibel mit dem erwarteten Typ in der jeweiligen Umgebung ist.
Die Mechanismen zur Behandlung von Fehlerfällen sind – im Vergleich zu klassischen Programmiersprachen – nur rudimentär ausgeprägt. Wann immer ein Fehler auftritt, wird implizit die XQuery-Funktion fn:error() aufgerufen und die Bearbeitung eingestellt. Diese Wirkung wird dadurch erzielt, dass die Funktion fn:error() als Rückgabewert den speziellen "Datentyp" none besitzt, der für normale Benutzer nicht verwendbar ist und ausschließlich für diesen Zweck existiert. Im folgenden Beispiel wird die Fehlerfunktion benutzt, um – auf ungewöhnliche Art – eine unerwartete Datensituation zu signalisieren.
let $p := fn:collection("Patienten")//Patient_stationär
let $e := if ($p) then 1
else fn:error("Keine stationären Patienten!!!")
return $p
Die folgende Tabelle gibt die Signatur der Fehlerfunktion wieder.
Signatur | Beschreibung |
---|---|
fn:error([ $srcval as item?]) as none | bricht die Bearbeitung mit einer optionalen Fehlermeldung ab |
fn:trace( $value as item*, $label as xs:string) as item* | liefert funktional den übergebenen Wert unverändert zurück; als Seiteneffekt wird sowohl der Wert als auch die Zeichenkette an eine implementierungs- abhängige Protokollierungskomponente übertragen |
Tab. Funktionen zur Analyse von Zeitangaben
Zur Vermeidung inhaltlicher Fehler existiert in diesem Zusammenhang eine weitere Funktion zur Protokollierung von Ergebnissen der Auswertung eines Ausdrucks. Die fn:trace()-Funktion erlaubt ein rudimentäres Debugging von XQuery-Ausdrücken und benutzerdefinierten Funktionen. Der erste Parameter stellt dabei den Gegenstand der Untersuchungen dar und wird zunächst unverändert an den aufrufenden Kontext übergeben. Zusätzlich wird der Wert des Ausdrucks zusammen mit der zusätzlich anzugebenden Zeichenkette an eine Protokollierungskomponente überreicht.
let $x := (12, 4711)
return
fn:trace(fn:max($x), "Maximaler Wert")
Zum Beispiel resultiert der vorangegangene FLWOR-Ausdruck in der Aufzeichnung (bzw. direkten Ausgabe) der Zeichenketten "4711" und "Maximaler Wert" in implementierungsabhängiger Reihenfolge.
Quelle: "XQuery – Grundlagen und fortgeschrittene Methoden", dpunkt-Verlag, Heidelberg (2004)
<< zurück | vor >> |