2011-01-13 2 views
1

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

[RPC Ошибка faultString = "Отключен канал" faultCode = "Client.Error.DeliveryInDoubt" faultDetail = "Отключен канал до получения подтверждения" ] at 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] at mx.rpc :: Responder/fault() [E: \ dev \ 4.0.0 \ frameworks \ projects \ rpc \ src \ mx \ rpc \ Responder.as: 68] at 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 \ рамки \ Projects \ RPC \ SRC \ тх \ сообщениями \ каналы \ NetConnectionChannel.as : 684] at flash.events::EventDispatcher/dispatchEventFunction() at 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 \ rpc \ 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 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 (новое исключение («сообщение об ошибке, которое вы хотите», $ errorCode));

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

Благодарим вас за продвинутый !!!

ответ

0

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

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

0

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

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

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