为什么在Python中使用try / except结构中的else?

时间:2013-08-22 17:56:45

标签: python exception-handling try-catch

我正在学习Python并偶然发现了一个我无法轻易理解的概念:else构造中的可选try块。

根据the documentation

  

try ... except语句有一个可选的else子句,当时   礼物,必须遵循除了条款以外的所有条款它对代码很有用   如果try子句没有引发异常,则必须执行。

我感到困惑的是为什么如果try子句中没有引发异常,必须执行代码 - 为什么不简单地让它遵循try / except at相同的缩进级别?我认为这将简化异常处理的选项。或者另一种询问方式是else块中的代码如果仅仅遵循try语句就不会这样做,而不依赖于它。也许我错过了什么,请开导我。

这个问题与this one有些相似,但我找不到我要找的东西。

2 个答案:

答案 0 :(得分:12)

else块仅在try中的代码未引发异常时执行;如果您将代码置于else块之外,则无论异常如何都会发生。此外,它发生在finally之前,这通常很重要。

当您有一个可能出错的简短设置或验证部分时,这通常很有用,然后是您使用您设置的资源的块,其中您不想隐藏错误。您无法将代码放在try中,因为当您希望它们传播时,错误可能会转到except子句。你不能把它放在构造之外,因为那里的资源肯定不可用,因为安装失败或者因为finally将所有东西都撕掉了。因此,您有一个else块。

答案 1 :(得分:4)

一个用例可以是阻止用户定义一个标志变量来检查是否引发了任何异常(正如我们在for-else循环中所做的那样)。

一个简单的例子:

lis = range(100)
ind = 50
try:
    lis[ind]
except:
    pass
else:
    #Run this statement only if the exception was not raised
    print "The index was okay:",ind 

ind = 101

try:
    lis[ind]
except:
    pass
print "The index was okay:",ind  # this gets executes regardless of the exception

# This one is similar to the first example, but a `flag` variable
# is required to check whether the exception was raised or not.

ind = 10
try:
    print lis[ind]
    flag = True
except:
    pass

if flag:
    print "The index was okay:",ind

<强>输出:

The index was okay: 50
The index was okay: 101
The index was okay: 10