2016-06-30 13 views
0

Wenn ich einen Fehler innerhalb einer XQuery Abfrage erhöhen, zum Beispiel mit:Ist es möglich, den Namespace eines erhöhten Fehlers abzurufen?

error(fn:QName('http://example.com', 'XMPL0001'), 'Conflict') 

... die folgenden zurückgeführt wird durch BaseX (es sein, wenn mit dem Server oder von innerhalb der GUI in Verbindung steht)

Stopped at ., 1/7: 
[XMPL0001] Conflict 

Ist es irgendwie möglich, den Namespace des Fehlers (in diesem Fall http://example.com) auch abzurufen?

Ich verwende einen angepassten PHP-Client und möchte diese Informationen verwenden, um mögliche (zukünftige) Konflikte mit meinen benutzerdefinierten Fehlercodes zu vermeiden und die Fehler zu analysieren, um entweder einen Standard BaseX\Exception oder einen benutzerdefinierten SomeNamespace\Exception zu werfen Namensraum des Fehlers.

Ich könnte natürlich einfach ein anderes Fehlercodemuster als das typische XQuery-Muster ABCD1234 verwenden, um mögliche (zukünftige) Fehlercode-Konflikte zu verhindern, aber die mögliche Verwendung eines Namensraums spricht mir mehr, weil ich dann definieren kann eine einheitliche Exception Schnittstelle, wie zum Beispiel:

interface ExceptionInterface 
{ 
    public function getCategory(); // the 4 alpha character part 
    public function getCode(); // the 4 digit part 
} 

ich bin derzeit BaseX 7.7.2, nebenbei bemerkt.

Antwort

1

Ja, können Sie Informationen über den Fehler abrufen a few variables in the error namespace verwenden, die im Rahmen der Try-catch-Anweisung sind, etwa so:

declare namespace err = "http://www.w3.org/2005/xqt-errors"; 

try { 
    error(fn:QName('http://example.com', 'XMPL0001'), 'Conflict') 
} 
catch * { 
    namespace-uri-from-QName($err:code) 
} 

Dies setzt voraus, dass Sie XQuery 3.0 verwenden.

+0

Aha, ich verstehe! Sie haben mir sehr nützliche Informationen zur Fehlerbehandlung gezeigt, die mir nicht bekannt waren. Da dies jedoch den Fehler "erfasst", wird mein PHP-Client nicht mehr über einen * tatsächlichen * Fehler informiert. Ich könnte wahrscheinlich einen gefangenen Fehler anstelle eines regulären Ergebnisses signalisieren, indem ich zum Beispiel ein '' Element zurückschicke (und vielleicht ist das sogar eine geeignetere Strategie als mein aktueller). Aber ich hatte gehofft, dass der Fehlermechanismus, auf den ich mich gerade stütze, etwas mehr Details über den Fehler liefern würde. Sie würden nicht zufällig von einem solchen Mechanismus wissen, oder? –

+0

Ich bin froh! Was PHP sieht, ist jedoch BaseX-spezifisch. Vielleicht könnten Sie das BaseX-Verhalten in der catch-Klausel emulieren/umschreiben, einschließlich Ausgabe- und HTTP-Statuscode, wenn es über HTTP kommuniziert, und wenn BaseX Sie dies ändern lässt? –

+0

Danke für den Vorschlag. Das Problem ist: Ich wäre nicht in der Lage, die Low-Level-Bytes zu emulieren, die das [Serverprotokoll] (http://docs.basex.org/wiki/Server_Protocol#Command_Protocol) verwendet, um einen * tatsächlichen * Fehler zu signalisieren. Aber keine Sorge, Sie haben mir genug Input gegeben, um a) entweder bei dem zu bleiben, was ich jetzt habe (und einfach den Fehler-Namespace ignorieren) oder b) das Element ' 'zurückgeben und * das * als Fehlersignal verwenden. Also, nochmals vielen Dank für Ihre wertvollen Informationen! –

Verwandte Themen