否则不会在try-except-else

时间:2016-06-01 00:00:38

标签: python exception try-catch

我正在使用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子句中正确引发错误?

1 个答案:

答案 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; } } 块内发生什么,都始终定义它。