【问题标题】:Using the Python "requests" library, how can I tell if a ConnectionError is client side or Server side?使用 Python“请求”库,如何判断 ConnectionError 是客户端还是服务器端?
【发布时间】:2013-01-09 13:34:29
【问题描述】:

这是我现在丑陋的小代码sn-p:

for i in range(5):
        try:
            self.startTime=time.time()
            self.rawfeed=requests.get(self.feedurl)
            continue
        except ConnectionError:
            print "Got a connection error.  Retrying", i
            time.sleep(i*i) # giving a bit longer wait each time
            pass
if i == 5: raise
self.ResponseTime=time.time()-self.startTime

这里有两个问题。首先,我的 except 语句似乎没有将“ConnectionError”识别为异常(已解决,谢谢,stackers),而是抱怨它不是全局变量。其次,更重要的是,我真的很想知道错误是我方还是服务器方。

通常我想重试我的错误,但放弃并报告 SERVER 错误。 (“我的”错误是指服务器错误以外的任何错误。)

【问题讨论】:

  • 删除尝试,除了。检测异常。代码是否为您的端错误和服务器端错误提供相同的异常?(尝试重现错误)如果它们不同,请抓住你的。顺便说一句,您应该导入相关的异常来捕获它。
  • re: 你的'i 不是一个全局变量'——在这种情况下你想在 for 循环中使用相对晦涩的 else 子句:docs.python.org/release/1.5/tut/node23.html

标签: python python-requests


【解决方案1】:

查看requests 源代码,ConnectionError 仅在重试最大次数时才会引发 (MaxRetryError)。

except MaxRetryError, e:
    if not self.config.get('safe_mode', False):
        raise ConnectionError(e)

很难说这是由您自己还是服务器引起的,因为双方的许多问题都可能导致完全相同的错误。例如,如果服务器的 HTTP 守护程序未运行,您的连接尝试将超时。如果您在路由器中阻止它们或您的路由器因其他原因断开连接,也会发生完全相同的事情。

但是,您没有发现的异常HTTPError 更有可能是您可能会死的服务器错误。 ConnectionError 有一定的可能性,但完全不能保证成为你自己。

您的第二个问题是您没有正确导入这些类。将您的例外更改为except requests.ConnectionError,或更改为from requests import ConnectionError, HTTPError

【讨论】:

  • 谢谢。我就是这么想的。看起来如果我修复我的 try 块,我将能够做我需要的事情。至少是第一个近似值。
【解决方案2】:

与 Python 中的任何名称一样,您需要导入 ConnectionError 才能使用它。在这种情况下,它可以通过已经导入的 requests 命名空间使用,因此您可以使用 except requests.ConnectionError:

关于您的主要查询,不幸的是,这并没有什么意义。你和服务器之间有整个互联网:在什么时候你会将某些东西定义为“你的”错误?你的wifi接入点?你的路由器?你的调制解调器?你的网络服务供应商?您和目的地之间的某个上游代理?当然,如果不使用像 traceroute 这样的实用程序,就无法判断错误发生在哪里。

【讨论】:

  • 啊,是的,我可以看到不清楚。 “我的”错误不是服务器报告的错误。我想知道服务器是否以某种错误的方式行事,或者其他什么。
  • 感谢“try/except”的帮助。我还在纠结这个问题。在我开始使用 Python 之前,请归咎于 Perl 十年。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 2017-12-15
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 2015-11-04
相关资源
最近更新 更多