2016-06-30 1 views
0

Когда я поднимаю ошибку внутри запроса XQuery, например, с:Возможно ли получить пространство имен повышенной ошибки?

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

... возвращается Basex (будь то при общении с сервером, или из графического интерфейса пользователя)

следующее
Stopped at ., 1/7: 
[XMPL0001] Conflict 

Как можно получить пространство имен ошибки (в данном случае http://example.com)?

Я использую настроенный клиент PHP, и я хотел бы использовать эту информацию, чтобы предотвратить возможные (будущие) конфликты с моими кодами ошибок и проанализировать ошибки, чтобы выбросить либо стандартный BaseX\Exception, либо пользовательский SomeNamespace\Exception, в зависимости от пространство имен ошибки.

Я мог бы, конечно, использовать другой шаблон кода ошибки, чем обычный шаблон XQuery ABCD1234, чтобы предотвратить возможные (будущие) конфликты кода ошибки, но возможное использование пространства имен обращается ко мне больше, потому что тогда я могу определить равномерная Exception интерфейс, такие как:

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

Я в настоящее время использую Basex 7.7.2, кстати.

ответ

1

Да, вы можете получить информацию об ошибке, используя 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

Ага, я вижу! Вы показали мне очень полезную информацию об обработке ошибок, о которой я не знал. Однако, поскольку это фактически «улавливает ошибку», мой PHP-клиент больше не будет уведомлен об ошибке * фактического *. Я мог бы, вероятно, сигнализировать пойманную ошибку вместо регулярного результата, возвращая элемент '', например (и, возможно, это даже более подходящая стратегия, чем моя текущая). Но я надеялся, что механизм ошибок, на который я сейчас полагаюсь, предоставит немного больше информации об ошибке. Вы бы не узнали о таком механизме, не так ли? –

+0

Я рад! Однако PHP видит BaseX. Возможно, вы могли бы эмулировать/переписать поведение BaseX в предложении catch, включая вывод и код состояния HTTP, если он обменивается данными по HTTP и если BaseX позволяет вам изменить это? –

+0

Спасибо за предложение. Проблема в том, что я не смог бы эмулировать байты нижнего уровня, которые использует [серверный протокол] (http://docs.basex.org/wiki/Server_Protocol#Command_Protocol), чтобы сигнализировать * актуальную * ошибку. Но не беспокойтесь, вы дали мне достаточно ввода для a) либо придерживаться того, что у меня есть (и просто игнорировать пространство имен ошибок), либо b) пойти с возвратом элемента '' и использовать *, который * в качестве сигнала ошибки. Итак, еще раз спасибо за вашу ценную информацию! –

 Смежные вопросы

  • Нет связанных вопросов^_^