我正在使用python中的一个特殊的try-except-else块,我尝试获取一个值,如果我失败了,我会尝试创建它以便稍后使用。
然而,创建过程并不完美(它实际上是从互联网上获取并且可能由于多种原因而失败)并且我注意到当失败时它不会被提升。我得到的唯一信息是没有定义值
NameError: name 'value' is not defined
由于错误可能很多,我非常感谢在else子句中看到错误的完整引用
请注意:所有尝试都会引发KeyError,并且实例化过程不会引发此错误,它始终是其他内容。以下是示例代码:
try:
value = _list[key]
except KeyError:
try:
number = kwargs['number'] # A number might be parsed via kwargs
except KeyError:
clean_everything()
value = None
raise KeyError('Value not found! ' +
'Need a number to create new instance!')
else:
value = Value(number=number) # This instantiation can raise other errors!
_list[homeTeam] = _listnumber[number] = value # Update lists for future reference.
finally:
print value
任何人都对为什么else条款没有提出有任何想法?有没有更好的方法来写这个?
谢谢,
编辑:在嵌套式try中添加了对值的处理。 这让我相信嵌套的尝试不起作用,因为嵌套的错误只会在最外层之后引发。 即只有在外部尝试完成后才会引发内部错误。
这可能会引出一个新问题:如何在except子句中正确引发错误?
答案 0 :(得分:0)
尝试访问value
而不先定义它确实会引发NameError
。如果由于KeyError
不在key
中而引发_list
,那么value
将永远不会在try
块中定义value
。因为您在两个except
块中重新定义finally
,所以这应该没问题。但是,您的value
数据块在访问之前不会重新定义NameError
,因此在以下情况下您将获得value = _list[key]
:
KeyError
引发NameError
以外的错误(例如_list
未定义clean_everything()
时)value = Value(number=number)
引发任何错误value
引发任何错误您可以在try
块之前定义try
,以便无论@media print {
.app-NewPage-Button1 {
display : none;
}
}
块内发生什么,都始终定义它。