2017-01-29 50 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并相应地修改您的代码。