2011-01-13 2 views
1

나는 FlashBuilder 도구를 사용하여 젠드 AMF 서비스를 만들었습니다. 내가 시도하고 싶었던 것은 자동으로 생성 된 메소드 중 하나를 변경하여 예외를 throw하여 동작을 확인하는 것이 었습니다. 예외가 대신 내 플렉스 애플 리케이션에 연재되고있다 :젠드 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 :: Responder/fault() [E : \ dev \ 4.0.0 \ frameworks \ projects \ rpc \ src \ mx \ rpc \ Responder.as : 68]에서을 mx \ rpc \ AbstractInvoker.as : (NetConnectionMessageResponder/channelDisconnectHandler()에서 mx.rpc :: AsyncRequest/fault() [E : \ dev \ 4.0.0 \ frameworks \ projects \ rpc \ src \ mx \ rpc \ AsyncRequest.as : 113] ) \ dev \ 4.0.0 \ frameworks \ projects \ rpc \ src \ mx \ messaging \ channels \ NetConnectionChannel.as : 684] at flash.events::EventDispatcher/dispatchEventFunction() at flash.events::EventDispatcher/dispatchEvent() at mx.messaging :: Channel/disconnectSuccess() [E : \ dev \ 4.0.0 \ frameworks] \ E \ \ dev \ 4.0.0 \ frameworks \ projects \ rpc \ src \ mx \ projects \ rpc \ src \ mx \ messaging \ Channel.as : 1214] at mx.messaging.channels :: NetConnectionChannel/internalDisconnect() \ MFC \ channel \ NetConnectionChannel.as : 175] at mx.messaging.channels :: AMFChannel/internalDisconnect() [E : \ dev \ 4.0.0 \ frameworks \ projects \ rpc \ src \ mx \ messaging \ channels \ AMFChannel .as : 355] at 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 (새 예외 ('원하는 오류 메시지', $ errorCode));

나는 이것을 정말로 기대하지 않았다. 어떻게 작동시킬 수 있습니까?

고맙습니다!

답변

0

글쎄, 예외 메시지와 우리를 위해 일하는 코드를 직렬화하고있다. 부분적으로 그러나 그것을한다. 나는 내 질문에서 코드를 복사 한 서비스 구성 요소가 예외를 억제하고 채널 연결을 끊는 예외 처리기를 포함한다는 것을 알지 못했다. 예외 처리기를 제거하여 클라이언트에게 예외 메시지와 메시지 코드를 보내는 Zend로 예외 버블을 보냈습니다.

실제 예외를 AS3 객체로 보내고 싶습니다. 그러나 무엇을 말할 수 있습니까? 이런 식으로 나는 또한 예외의 속성을 직렬화 할 것이다. 불행히도 사용자 정의 예외에 대해서도 마찬가지입니다.

0

젠드 Amf는 응답 유형의 순차 변환 프로토콜로,이를 AMF 형식으로 변환합니다. 오류 메시지는 일반적으로 민감한 보안 정보를 가지고 있기 때문에 다시 보내지지 않습니다. 대부분의 다른 PHP amf 직렬화는 이런 식으로 작동하지 않습니다. 예외가있는 경우이를 포착하여 표준 지원 응답 유형으로 변환해야합니다. 또한 모든 코드에서 PHP는 사용자가이를 허용 할지라도 제어 구조가 아니므로 모든 Try에는 catch가 필요합니다.

프로덕션이 아닌 엔드 포인트를 디버깅하기 위해 구성한 경우.

require_once 'Zend/Amf/Exception.PHP '; 새로운 Zend_Amf_Exception을 던집니다 ('원하는 오류 메시지', $ errorCode);