Python 当客户提前断开连接时,如何对烧瓶上的断管错误进行例外处理?

Python 当客户提前断开连接时,如何对烧瓶上的断管错误进行例外处理?,python,ajax,flask,Python,Ajax,Flask,我使用flask进行开发,而不是生产,我有一个ajax请求的视图,类似这样: @application.route('/xyz/<var>/', methods=['GET']) def getAjax(var): ... return render_template(...) 我可以使用try:except块捕获此异常吗? 我尝试将所有getAjax函数的内容放在一个: try: ... except socket.error, e: loggin

我使用flask进行开发,而不是生产,我有一个ajax请求的视图,类似这样:

@application.route('/xyz/<var>/', methods=['GET'])
def getAjax(var):
    ...
    return render_template(...)
我可以使用
try:except
块捕获此异常吗? 我尝试将所有
getAjax
函数的内容放在一个:

try:
    ...
except socket.error, e:
    logging.warn("socket error " + e)
但它不起作用,我应该在哪里做?或者如何

编辑:添加ajax调用

$.ajax({
    type: 'GET',
    url: '/xyz/' + var + '/',
    data: {
            ...
        },
    timeout: 2000,
    success: function(data) {
        ...
        },
    error: function(XMLHttpRequest, textStatus, errorThrown) {
        ...
        }
    });

您所面临的问题是,通过使用Flask,您无法控制整个服务器堆栈,因此无法捕获应用程序代码之外出现的错误。socket.error实际上是在Flask的内置开发服务器中传播的(它可能只是SocketServer的包装器,我不知道细节),因为它只是一个不适合生产使用的开发服务器,所以它不会处理客户机突然死亡的情况

一般来说,这不重要。如果您实际使用Gunicorn或其他什么来部署代码,那么WSGI容器将在不需要您任何帮助的情况下处理损坏的管道。您可以通过在这样一个容器中本地运行代码来测试这一点——尝试在您的计算机上安装Gunicorn,看看当您的应用程序代码在其包装器中运行时会发生什么

如果你仍然有问题,那么事情可能会变得复杂,因为问题可能在许多不同的地方,因此,如果您使用的是一个不太知名的WSGI容器,那么它也可能无法处理此错误。也可能是他们用的东西无法处理


一般来说,如果您以标准方式使用web框架,则不必自己处理低级服务器错误。这就是为什么您首先使用web框架的原因。如果您试图推出自己的视频流或其他内容,则完全是另一种情况,但这里的情况似乎并非如此。

您检查过了吗?如果你想要更多的反馈,考虑发布你的Ajax代码。很好,所选的答案似乎并没有给我更多的信息,因为我已经知道错误是因为客户没有接收到答案。但我不确定海报上的编辑是什么意思:说他没有从Python发回响应。例如,你有没有尝试将
超时时间增加到20000?是的,我通常使用12000,我尝试了更高的值,但这与超时无关,textStatus不是timeout,如果问题是客户端关闭套接字,那么增加超时也没有多大意义。。。此外,我并不是在试图避免错误,我在试图处理它。汉克斯,我实际上是在gunicorn后面的生产环境中运行代码,当同样的事情发生在生产环境中时,不会出现任何错误。ajax调用的错误部分仍然会被调用,但是{textStatus}是“error”,而{errorshown}是空的。根据你说的,我认为这不应该发生。我的假设正确吗?服务器错误肯定不应该发生,但事实并非如此。但是,我很惊讶Javascript代码在关闭选项卡/导航离开时会停留足够长的时间来运行错误处理代码。它可能只是函数调用的一部分。我会在不同的浏览器上尝试,看看你是否有相同的行为。不过,如果没有任何负面影响,我可能不会担心退出时出现浏览器端错误。
$.ajax({
    type: 'GET',
    url: '/xyz/' + var + '/',
    data: {
            ...
        },
    timeout: 2000,
    success: function(data) {
        ...
        },
    error: function(XMLHttpRequest, textStatus, errorThrown) {
        ...
        }
    });