Zend AMF и обработка исключений - PullRequest
1 голос
/ 13 января 2011

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

[RPC Fault 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 \ projects \ rpc \ src \ mx \ rpc \ AsyncRequest.as: 113] в NetConnectionMessageResponder / channelDisconnectHandler () [E: \ dev \ 4.0.0 \ frameworks \ projects \ rpc \ src \ mx \ messaging \ channel \ 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 \ рамки \ Projects \ RPC \ SRC \ тх \ сообщениями \ каналы \ NetConnectionChannel.as:175] в mx.messaging.channels :: AMFChannel / internalDisconnect () [E: \ dev \ 4.0.0 \ frameworks \ projects \ rpc \ src \ mx \ messaging \ channel \ AMFChannel.as: 355] вmx.messaging.channels :: AMFChannel / statusHandler () [E: \ dev \ 4.0.0 \ frameworks \ projects \ rpc \ src \ mx \ messaging \ channel \ AMFChannel.as: 445]

каналdisconnects ...

[RPC Fault 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 ('theнужное сообщение об ошибке ', $ errorCode));

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

Спасибо заранее!

Ответы [ 2 ]

0 голосов
/ 19 января 2011

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

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

0 голосов
/ 16 января 2011

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

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

require_once 'Zend / Amf / Exception.php';бросить новый Zend_Amf_Exception ('сообщение об ошибке, которое вы хотите', $ errorCode);

...