在http请求中处理flex中的Python错误/异常

时间:2012-03-15 06:02:42

标签: python flash flex http exception

这是一个我现在努力解决退出问题的问题 我有一个python + GAE后端,有一个通过JSON进行通信的flex客户端。我正在使用flex的HttpService绑定到具有结果和错误回调的Responder。

当python引发异常时,我似乎没有在flex中获取它。我做了一些研究,发现问题可能在于flash运行时无法处理状态代码不是200的http响应。

那么如何在客户端中获取这些异常呢?

由于

1 个答案:

答案 0 :(得分:1)

TL; DR - 在Python中捕获异常并将自定义JSON对象与要显示给客户端的消息一起发送回Flex。

这是我遵循的模式。我将给出的示例是在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已经感染了您的计算机。

至于flex方面,这是我的结果处理程序:

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();