我编写了一个搜寻器,以从问答网站获取信息。由于并非所有字段始终都显示在页面中,因此我使用了多个try-excepts来处理这种情况。

def answerContentExtractor( loginSession, questionLinkQueue , answerContentList) :
    while True:
        URL = questionLinkQueue.get()
        try:
            response   = loginSession.get(URL,timeout = MAX_WAIT_TIME)
            raw_data   = response.text

            #These fields must exist, or something went wrong...
            questionId = re.findall(REGEX,raw_data)[0]
            answerId   = re.findall(REGEX,raw_data)[0]
            title      = re.findall(REGEX,raw_data)[0]

        except requests.exceptions.Timeout ,IndexError:
            print >> sys.stderr, URL + " extraction error..."
            questionLinkQueue.task_done()
            continue

        try:
            questionInfo = re.findall(REGEX,raw_data)[0]
        except IndexError:
            questionInfo = ""

        try:
            answerContent = re.findall(REGEX,raw_data)[0]
        except IndexError:
            answerContent = ""

        result = {
                  'questionId'   : questionId,
                  'answerId'     : answerId,
                  'title'        : title,
                  'questionInfo' : questionInfo,
                  'answerContent': answerContent
                  }

        answerContentList.append(result)
        questionLinkQueue.task_done()

而且此代码有时(可能会或可能不会)在运行时给出以下异常:
UnboundLocalError: local variable 'IndexError' referenced before assignment

行号指示错误发生在第二个except IndexError:
感谢大家的建议,很乐意给您应得的分数,太糟糕了,我只能将其中一个标记为正确的答案...

最佳答案

我认为问题是此行:

except requests.exceptions.Timeout ,IndexError

这等效于:
except requests.exceptions.Timeout  as IndexError:

因此,您正在将IndexError分配给requests.exceptions.Timeout捕获的异常。可以通过以下代码重现错误:
try:
    true
except NameError, IndexError:
    print IndexError
    #name 'true' is not defined

要捕获多个异常,请使用元组:
except (requests.exceptions.Timeout, IndexError):
UnboundLocalError即将到来是因为您的函数将IndexError视为本地变量,因此在实际定义之前尝试访问其值将引发UnboundLocalError错误。
>>> 'IndexError' in answerContentExtractor.func_code.co_varnames
True

因此,如果未在运行时执行此行(requests.exceptions.Timeout ,IndexError),则其下面使用的IndexError变量将引发UnboundLocalError。重现该错误的示例代码:
def func():
    try:
        print
    except NameError, IndexError:
        pass
    try:
        [][1]
    except IndexError:
        pass
func()
#UnboundLocalError: local variable 'IndexError' referenced before assignment

关于python - 捕获异常获取UnboundLocalError,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21927065/

10-12 22:37