2013-01-09 67 views
3

這是我現在的醜陋的小的代碼片段:這裏使用Python「請求」庫,如何判斷ConnectionError是客戶端還是服務器端?

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」是一個異常(SOLVED,thanks,stackers),而是抱怨說它不是全局變量。其次,更重要的是,我真的很想知道錯誤是我的方面還是服務器方面。

通常我想重試MY錯誤,但放棄並報告SERVER錯誤。 (通過「我的」錯誤,我的意思是服務器錯誤以外的任何東西。)

+0

刪除嘗試,除外。檢測異常。代碼是否爲你的側面錯誤和SERVER側面錯誤提供了相同的異常?(嘗試重現錯誤)如果它們不同,請抓住你的錯誤。順便說一句,你想導入相關的異常來捕捉它。 – ayyayyekokojambo

+1

re:你的'我不是一個全局變量' - 這是一個你想要在for循環中使用相對晦澀的'else'子句的例子:http://docs.python.org/release/1.5/ tut/node23.html – bgporter

回答

3

看看requests源代碼,ConnectionError只會在重試最大次數(MaxRetryError)時纔會引發。

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

這是相當不可能說這是否是你身邊或服務器引起的,如雙方如此多的問題,可能會導致此完全相同的錯誤。例如,如果服務器的HTTP守護程序未運行,則連接嘗試將超時。如果您在路由器中阻止它們,或者您的路由器由於其他原因而斷開連接,則會發生完全相同的情況。

異常HTTPError,但是,你沒有捕捉到,更有可能是一個服務器錯誤,你可以死。成爲你自己的可能性有點可能,但一點也不能保證。

你的第二個問題是你沒有正確導入這些類。要麼改變你的除外except requests.ConnectionError,或做from requests import ConnectionError, HTTPError

+0

謝謝。這就是我的想法。看起來如果我修理我的嘗試塊,我將能夠做我需要的。至少第一次近似。 –

2

與Python中的任何名稱一樣,在使用它之前需要先導入ConnectionError。在這種情況下,它可以通過已導入的requests命名空間獲得,因此您可以執行except requests.ConnectionError:

至於你的主要查詢,不幸的是這並沒有什麼意義。你和服務器之間有整個互聯網:你會在什麼時候將某些東西定義爲「你的」錯誤?你的wifi接入點?你的路由器?你的modem?你的ISP?你和目的地之間有一些上游代理服務器?當然,沒有辦法確定發生錯誤的位置,而無需使用像traceroute這樣的實用程序。

+0

啊,是的,我可以看到這一點還不清楚。 「我的」錯誤可能是服務器報告的錯誤之外的任何錯誤。我想知道SERVER是以某種錯誤的方式行事,還是其他的行爲。 –

+0

並感謝您的「嘗試/除外」援助。我仍然圍繞着我的腦袋。在我開始pythoning之前,責備十年的Perl。 –

相關問題