2017-01-29 77 views
0

我有代碼象下面這是在部分一類:如何處理Python3.6中的「UnboundLocalError」?

def getHtmlResponse(self, inUrl): 

    while True: 
     try: 
      res = urllib.request.urlopen(inUrl) 
      html = res.read() 
      soup = BeautifulSoup(html, 'html.parser') 
     except urllib.error.URLError: 
      pass 
     break 

    return soup 

有時,我有一個錯誤信息象下面這樣:

File "/Users/chongwonshin/PycharmProjects/Crawler_test/Content_crawler.py", line 99, in getHtmlResponse 
    return soup 
UnboundLocalError: local variable 'soup' referenced before assignment 

此錯誤只發生幾次在許多試驗。 我該如何處理這種類型的錯誤?

+1

你通過的情況如何?那麼'湯'如何設置? – jonrsharpe

+0

我想重新嘗試「嘗試」部分腳本。那麼,我應該使用「繼續」而不是「通過」? –

+0

是的,確切地說。或者把'break'放在'else'中。 – jonrsharpe

回答

1

如果在try塊的前兩行發生異常,則湯不會被啓動。因此,您可以在區塊外重新啓動soup

def getHtmlResponse(self, inUrl): 

    while True: 
     try: 
      res = urllib.request.urlopen(inUrl) 
      html = res.read() 
      soup = BeautifulSoup(html, 'html.parser') 
     except urllib.error.URLError: 
      soup = '' 
      pass 
     break 

    return soup 
0

讓我們簡化您的代碼。因爲你總是break退出循環,循環實際上是一個空操作,可以將其刪除:

def getHtmlResponse(self, inUrl): 
    try: 
     res = urllib.request.urlopen(inUrl) 
     html = res.read() 
     soup = BeautifulSoup(html, 'html.parser') 
    except urllib.error.URLError: 
     pass 
    return soup 

現在考慮如果BeautifulSoup()調用拋出一個異常,會發生什麼:分配給soup從未發生過但是你的代碼仍然試圖返回它。

如果發生這種情況,您需要決定要做什麼。返回一個不存在的對象顯然不是一種選擇。例如,您可以選擇返回None並相應地修改您的代碼。