2012-03-15 16 views
0

ここで私はいくつかの時間を今すぐ解くのに苦労している問題です。
私は、JSON経由で通信するflexクライアントを持つpython + GAEバックエンドを持っています。私は結果とフォールトコールバックでレスポンダにバインドされたflexのHttpServiceを使用しています。 Pythonは例外を発生させた場合httpリクエストでflexのPythonフォールト/例外を処理する

、私はフレックスでそれを得るように見えることはありません。私はいくつかの研究を行なったし、問題はおそらく、どのように私は、クライアントにこれらの例外を得るのですかFlashランタイムが200

以外のステータスコードをHTTPレスポンスを扱うことができないという事実にあることが判明しましたか?

おかげ

+0

あなたは例外IOErrorかとSecurityErrorのEventListenerを試してみました。 – michael

答えて

1

TL; DR - Pythonでキャッチ例外とあなたが戻っフレックスに、クライアントに表示するメッセージで、カスタムJSONオブジェクトを送信します。

これは私が従うパターンです。私が与える例はC#ですが、私は同じ原則をPythonに適用できると仮定しています。

私は、Webサービスで例外を処理し、私がユーザーに表示したいエラーを含むJSONオブジェクトを送信します。

ここで私は、エラーをキャッチしています:ここで

try 
{ 
    string jsonResponse = doStuff(); 

    return Json(jsonResponse, JsonRequestBehavior.AllowGet); 
} 
catch (Exception ex) 
{ 
    return Json(new GetTokenError(ex.Message), JsonRequestBehavior.AllowGet); 
} 

は、私がJSONに変換し、クライアントに返すために使用するリターンオブジェクトです:このメソッドを使用して

/// <summary> 
/// Used for displaying consistent error messages 
/// </summary> 
public class GetTokenError 
{ 
    /// <summary> 
    /// Ctor 
    /// </summary> 
    /// <param name="error">Error message to display</param> 
    public GetTokenError(string error) 
    { 
     this.error = error; 
    } 

    /// <summary> 
    /// The error to display 
    /// </summary> 
    public string error { get; set; } 
} 

は常に200を返します。 Webサーバーに何か問題がない限り、クライアントとWebサーバー間の接続、またはgremlinsがマシンに感染しています。ここではフレックス側については

は、私の結果ハンドラです:

var http:HTTPService = new HTTPService(); 
http.method = "POST"; 
http.resultFormat = HTTPService.RESULT_FORMAT_TEXT; 
http.url = "http://url.com"; 
http.addEventListener(ResultEvent.RESULT, function(evt:ResultEvent):void { 
    try { 
     var ret:Object = JSON.decode(evt.result.toString()); 

     if (ret.error) 
     { 
      // handle server error 
     } 

     // go about task 

    } catch (e:Error) { 
     // handle local error 
    } 
}); 

http.addEventListener(FaultEvent.FAULT, function(ex:FaultEvent):void { 
    // handle error with the call 
}); 

http.send(); 
+0

こんにちは、Bradに感謝します。私が間違っている場合は私を修正しますが、呼び出しが常に200として返された場合、FlexのFaultハンドラには到達しません。エラーと成功した結果の両方が結果ハンドラによって処理されます。フォルトハンドラでサーバエラーを処理する方法はありませんか? – yohairosen

+0

エラーハンドラは、呼び出し自体に何か問題が生じた場合、つまり接続タイムアウトやWebサービスが実行されていないなどの場合にヒットします。ただし、サービスが実行中でWebサービスがヒットし、例外Webメソッド内で発生し、私が示したようにそれを処理すると、レスポンス本体にエラーが返された200が返されます。それは役に立ちますか? –

+0

ええと...私がやっていること。 Flexの障害ハンドラにサーバ障害をルーティングするオプションがあるかどうかを確認したかっただけです。いずれにしても、エラープロパティをチェックするカスタムレスポンダを作成し、存在する場合はフォールトコールバックを呼び出すので、目的の動作が得られます。ありがとう – yohairosen

関連する問題