XMLRPC улавливает ошибки выполнения скрипта и отображает их в ответе

#php #error-handling #xml-rpc

#php #обработка ошибок #xml-rpc

Вопрос:

Как я могу передать ошибки выполнения скрипта в ответ XMLRPC, чтобы не получить исключение ошибки?

Возможно, я неправильно это настраиваю:

На сервере XMLRPC я добавляю Zend_XmlRpc_Server_Fault::attachFaultException('Exception'); вот так:

 Zend_XmlRpc_Server_Fault::attachFaultException('Exception');
$server = new Zend_XmlRpc_Server();
  

Но я все еще получаю исключение ошибки:

 Fault Exception:n651Failed to parse response
  

Как я могу передать ошибки выполнения скрипта в ответ?

Я также пытался установить это, но безуспешно:

 error_reporting(E_ALL); 
ini_set("display_errors",1);
ini_set("xmlrpc_errors",1);
  

Документы: http://php.net/manual/en/errorfunc.configuration.php

Пример ошибки XMLRPC при наличии ошибок в скрипте:

 Fault Exception:n651Failed to parse response
  

Пример, когда в скрипте есть ошибки:

 Fatal error: Call to undefined method
  

Оба являются результатом одной и той же ошибки скрипта, но мне нужно, чтобы XMLRPC отображал сообщение о неустранимой ошибке в ответе вместо того, чтобы выдавать ответ «не удалось проанализировать».

Ответ №1:

Вы можете использовать функцию set_error_handler() для перехвата ошибки скрипта и вместо этого выдавать исключение ErrorException:

 function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
  

Итак, когда вы вызываете Zend_XmlRpc_Server::handle():

 set_error_handler('exception_error_handler');
$server->handle();
restore_error_handler();
  

Редактировать: Пример # 1 со страницы ErrorException неверен. Вместо этого используйте версию из этого ответа.

Комментарии:

1. Хм, это выдает мне код ошибки 404 и строку ошибки неизвестной ошибки при добавлении кода: Array ( [0] => Array ( [Код ошибки] => 404 [Строка ошибки] => Неизвестная ошибка ) )

2. если я удалю ваш код, функциональность будет работать просто отлично, добавив ваш код, я получу приведенный выше комментарий

3. Моя ошибка, код был неправильным. Я скопировал / вставил плохой пример из php.net. Кроме того, я вижу, вы специально хотели перехватить фатальную ошибку. Их вообще нельзя перехватить, вы должны остановить их до того, как они произойдут. Где возникает ваша фатальная ошибка?

4. Я просто хочу это для разработки, поскольку запуск XMLRPC с новой функциональностью иногда прерывает текущий процесс. Прямо сейчас у меня есть отдельный скрипт, который просто создает экземпляр нового класса и выполняет тот же процесс, что и служба XMLRPC. Исправьте ошибки (если таковые имеются), а затем запустите службу XMLRPC для завершения процесса. Время от времени что-то может ускользнуть от тестирования, в результате чего XMLRPC выдает исключение ошибки:n651Failed для анализа ответа, отследить который иногда бывает непросто. просто ищу более эффективный способ отладки / тестирования

5. еще одно замечание: я повторяю / печатаю ответ XMLRPC (который является массивом во время разработки) всех выполненных действий, echo $server-> handle(); в рабочей среде я просто указываю последнее действие, выполненное в качестве ответа XMLRPC