2013-04-30 38 views
0

我有一段代碼在Python中的一個線程內執行的問題。一切工作正常,直到我開始使用超過100條或150線,然後我得到下面的錯誤在幾個線程:python「分配之前引用的本地變量」與數百個線程

resp.read(1) 
UnboundLocalError: local variable 'resp' referenced before assignment. 

的代碼如下:

try: 
     resp = self.opener.open(request) 
     code = 200 
    except urllib2.HTTPError as e: 
     code = e.code 
     #print e.reason,_url 
     #sys.stdout.flush() 
    except urllib2.URLError as e: 
     resp = None 
     code = None 

    try: 
     if code: 
      # ttfb (time to first byte) 
      resp.read(1) 
      ttfb = time.time() - start 
      # ttlb (time to last byte) 
      resp.read() 
      ttlb = time.time() - start 
     else: 
      ttfb = 0 
      ttlb = 0 
    except httplib.IncompleteRead: 
     pass 

正如你可以,如果「看resp「由於例外而未被分配,它應該引發異常並且」代碼「未被分配,因此它不能輸入」resp.read(1)「。

任何人都有一些線索,說明它失敗了嗎?我想這與範圍有關,但我不知道如何避免這種情況或如何以不同的方式實施。

感謝和問候。

回答

0

定義和使用resp變量不是相同的代碼塊。其中一個在嘗試/除了,另一個在另一個嘗試/除了塊。試着將它們合併:

編輯:

ttfb = 0 
ttlb = 0 
try: 
     resp = self.opener.open(request) 
     code = 200 
     resp.read(1) 
     ttfb = time.time() - start 
     resp.read() 
     ttlb = time.time() - start   
    except urllib2.HTTPError as e: 
     code = e.code 
     #print e.reason,_url 
     #sys.stdout.flush() 
    except urllib2.URLError as e: 
     pass 
    except httplib.IncompleteRead: 
     pass 
+0

但這不是一個解決方案。我還可以在第二次嘗試中添加除UnboundLocalError之外的其他內容。問題是爲什麼'resp'變量沒有被分配? – dbranco 2013-04-30 14:50:28

+0

然後嘗試合併。我編輯了我的部分,你可以檢查它。 – 2013-04-30 16:40:45

5

基本的Python: 如果在公開徵集期間HttpError,RESP不會設置,但代碼將被設置爲e.code在異常處理程序。 然後測試代碼並調用resp.read(1)。

這與線程直接無關,但也許線程的高數量導致HTTPError。

+0

我認爲這是不正確的。如果響應代碼與200不同,例如404,則會引發HTTPError。它與404錯誤完美配合。此外,它可以很好地處理數以千計的錯誤和低併發請求。可能導致resp未分配的連接錯誤由URLError afaik管理,因爲它們不是HTTP錯誤(協議錯誤)。謝謝你的迴應。 – dbranco 2013-04-30 14:47:15

+0

@ user2336071如果您確定這一點,請告訴我您認爲在'HTTPError'情況下稱爲'resp'? – glglgl 2013-04-30 16:43:13

+1

@ user2336071我同意@dmeister這幾乎肯定是原因。特別是,你可以在你的第一個'try'塊中得到一個異常的唯一方法就是調用'opener.open'。如果你在那裏得到一個異常,那麼'resp'將不會有任何價值。無論如何,測試很簡單 - 嘗試向'except HTTPError'塊中添加'resp = None',並查看是否將錯誤從'UnboundLocalError'更改爲'AttributeError'(當您嘗試時訪問'resp.read',其中'resp == None' – 2013-04-30 16:47:37

相關問題