我编写了一个搜寻器,以从问答网站获取信息。由于并非所有字段始终都显示在页面中,因此我使用了多个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/