Zend AMF и обработка исключений

Я создал службу Zend AMF с помощью инструментов FlashBuilder. Что я хотел попробовать, так это изменить один из этих автоматически созданных методов, чтобы генерировать исключение, чтобы увидеть поведение. Вместо того, чтобы сериализовать исключение обратно в мое приложение Flex, оно дает мне следующее:

[Ошибка RPC faultString="Канал отключен" faultCode="Client.Error.DeliveryInDoubt" faultDetail="Канал отключен до получения подтверждения"] на mx.rpc::AbstractInvoker/http://www.adobe.com/2006/ flex/mx/internal::faultHandler()[E:\dev\4.0.0\frameworks\projects\rpc\src\mx\rpc\AbstractInvoker.as:345] в mx.rpc::Responder/fault()[ E:\dev\4.0.0\frameworks\projects\rpc\src\mx\rpc\Responder.as:68] в mx.rpc::AsyncRequest/fault()[E:\dev\4.0.0\frameworks\ проекты\rpc\src\mx\rpc\AsyncRequest.as:113] в NetConnectionMessageResponder/channelDisconnectHandler()[E:\dev\4.0.0\frameworks\projects\rpc\src\mx\messaging\channels\NetConnectionChannel.as: 684] в flash.events::EventDispatcher/dispatchEventFunction() в flash.events::EventDispatcher/dispatchEvent() в mx.messaging::Channel/disconnectSuccess()[E:\dev\4.0.0\frameworks\projects\rpc \src\mx\messaging\Channel.as:1214] в mx.messaging.channels::NetConnectionChannel/internalDisconnect()[E:\dev\4.0.0\frameworks\projects\rp c\src\mx\messaging\channels\NetConnectionChannel.as:175] в mx.messaging.channels::AMFChannel/internalDisconnect()[E:\dev\4.0.0\frameworks\projects\rpc\src\mx\messaging \channels\AMFChannel.as:355] в mx.messaging.channels::AMFChannel/statusHandler()[E:\dev\4.0.0\frameworks\projects\rpc\src\mx\messaging\channels\AMFChannel.as: 445]

Канал отключается...

[Ошибка RPC faultString="Канал отключен" faultCode="Client.Error.DeliveryInDoubt" faultDetail="Канал отключен до получения подтверждения"]

Это код:

публичная функция getAllUser() {

$stmt = mysqli_prepare($this->connection, "SELECT * FROM $this->tablename");
$this->throwExceptionOnError();

mysqli_stmt_execute($stmt);
$this->throwExceptionOnError();

$rows = array();

mysqli_stmt_bind_result($stmt, $row->id, $row->user_group_id, $row->username, $row->password, $row->active, $row->activation_key, $row->timezone, $row->created_on, $row->modified_on);

while (mysqli_stmt_fetch($stmt)) {
 $row->created_on = new DateTime($row->created_on);
 $row->modified_on = new DateTime($row->modified_on);
 $rows[] = $row;
 $row = new stdClass();
 mysqli_stmt_bind_result($stmt, $row->id, $row->user_group_id, $row->username, $row->password, $row->active, $row->activation_key, $row->timezone, $row->created_on, $row->modified_on);
}

mysqli_stmt_free_result($stmt);
mysqli_close($this->connection);

$errorCode = 1;

            throw(new Exception('the error message you want', $errorCode));

return $rows;

}

Обратите внимание на оператор throw:

throw(new Exception('нужное сообщение об ошибке', $errorCode));

Я действительно не ожидал этого. Как я могу заставить его работать?

Заранее благодарю!!!


person Timmo    schedule 13.01.2011    source источник


Ответы (2)


Zend Amf — это всего лишь протокол сериализации типов ответов для преобразования их в формат AMF. Сообщения об ошибках не отправляются обратно, поскольку обычно в них содержится конфиденциальная информация о безопасности. Большинство других сериализаций PHP amf не работают таким образом. Если у вас есть исключение, вам нужно перехватить его и преобразовать в стандартный тип ответа службы поддержки. Кроме того, в любом вашем коде для каждой попытки требуется Catch, поскольку это не структура управления, даже если PHP позволяет вам уйти с ним.

Если вы настроили свою конечную точку так, чтобы она не была рабочей, и она нужна вам только для отладки.

require_once 'Zend/Amf/Exception.php'; throw new Zend_Amf_Exception('нужное вам сообщение об ошибке', $errorCode);

person Wade Arnold    schedule 16.01.2011

Что ж, он сериализует сообщение об исключении и код, который выполняет эту работу за нас. Частично, но делает это. Я не заметил, что компонент службы, из которого я скопировал код в своем вопросе, содержал обработчик исключений, который подавлял бы исключение и просто отключал бы канал. Я удалил обработчик исключений, позволив исключению подниматься до Zend, который, в свою очередь, отправляет сообщение об исключении и код сообщения клиенту.

Я хотел бы, чтобы фактическое исключение было отправлено как объект AS3, но что я могу сказать. Таким образом, я бы также сериализовал свойства исключения. К сожалению, то же самое касается пользовательских исключений.

person Timmo    schedule 19.01.2011