3

这是我现在丑陋的小代码片段:

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),而是抱怨它不是全局变量。其次,更重要的是,我真的很想知道错误是我方还是服务器方。

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

4

2 回答 2

3

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

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

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

但是,您没有发现的ExceptionHTTPError更有可能是您可能会死的服务器错误。ConnectionError有点可能,但完全不能保证,成为你自己。

您的第二个问题是您没有正确导入这些类。要么改变你的 except except requests.ConnectionError,要么做from requests import ConnectionError, HTTPError

于 2013-01-09T13:48:48.797 回答
2

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

至于您的主要查询,不幸的是,这并没有什么意义。你和服务器之间有整个互联网:在什么时候你会把某事定义为“你的”错误?你的wifi接入点?你的路由器?你的调制解调器?你的网络服务供应商?您和目的地之间的某个上游代理?当然,如果不使用类似traceroute.

于 2013-01-09T13:46:19.170 回答