这是我现在丑陋的小代码片段:
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错误。 (通过“我的”错误,我的意思是服务器错误以外的任何其他内容。)
答案 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
这样的实用程序,就无法确定错误发生的位置。