使用Python“请求”库,如何判断ConnectionError是客户端还是服务器端?

时间:2013-01-09 13:34:30

标签: python python-requests

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

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”识别为异常(已解决,谢谢堆栈器),而是抱怨它不是全局变量。第二,更重要的是,我真的想知道错误是我的一方,还是服务方。

通常我想重试MY错误,但放弃并报告SERVER错误。 (通过“我的”错误,我的意思是服务器错误以外的任何其他内容。)

2 个答案:

答案 0 :(得分:3)

查看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

答案 1 :(得分:2)

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

关于你的主要查询,遗憾的是这并没有多大意义。你和服务器之间有整个互联网:你在哪一点上定义一些“你的”错误?你的无线接入点?你的路由器?调制解调器?你的ISP?某些上游代理位于您和目的地之间?当然,如果不使用像traceroute这样的实用程序,就无法确定错误发生的位置。