#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