2016-06-30 9 views
0

私は、たとえば、XQuery問合せの中からエラーを発生させる:発生したエラーの名前空間を取得することは可能ですか?

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

... BaseX(サーバーと通信するときにそれをすること、またはGUI内から)

によって返され、次の
Stopped at ., 1/7: 
[XMPL0001] Conflict 

エラーの名前空間(この場合はhttp://example.com)も同様に取得できますか。

カスタマイズされたPHPクライアントを使用しています。この情報を使用してカスタムエラーコードとの(将来の)競合を防ぎ、エラーを解析して標準BaseX\ExceptionまたはカスタムSomeNamespace\Exceptionを投げますエラーの名前空間。

可能な(将来の)エラーコードの競合を防ぐために、通常のABCD1234 XQueryパターン以外のエラーコードパターンを使用することもできますが、名前空間を使用する可能性があります。以下のような均一Exceptionインターフェース、:

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

私は現在の方法により、BaseX 7.7.2を使用しています。

答えて

1

はい、あなたはそうのような、のtry-catch文のスコープ内にあるa few variables in the error namespaceを使用して、エラーに関する情報を取得することができます

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) 
} 

これは、あなたは、XQuery 3.0を使用していることを前提としています。

+0

ああ、私は見る!私が気づいていなかったエラー処理に関する非常に有益な情報をあなたに教えてくれました。しかし、実際にはこれが 'catch'するので、PHPクライアントには実際のエラーは発生しなくなります。私はおそらく、通常の結果の代わりに、 ' '要素を返すことで、キャッチされたエラーを通知することができます(そして、それは私の現在よりもさらに適切な戦略です)。しかし、私が現在頼りにしているエラーメカニズムが、エラーに関するもう少し詳細を提供することを期待していました。あなたはそのような仕組みについて知りませんでしたか? –

+0

私はうれしいです! PHPが見ているのは、BaseX固有のものです。おそらく、HTTP経由で通信し、BaseXでこれを変更できる場合、出力とHTTPステータスコードを含むcatch節のBaseX動作をエミュレート/書き直すことができますか? –

+0

提案していただきありがとうございます。問題は、[サーバープロトコル](http://docs.basex.org/wiki/Server_Protocol#Command_Protocol)が実際のエラーを通知するために使用する低レベルのバイトをエミュレートできないことです。しかし、心配する必要はありません。私は今のものに固執して(そしてエラー名前空間を無視する)か、b) ''要素を返して、エラー信号として* that *を使用するのに十分な入力を与えました。あなたの貴重な情報に感謝します。 –

関連する問題