11

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

根据文档

try ... except 语句有一个可选的 else 子句,当它出现时,它必须跟在所有 except 子句之后。如果 try 子句不引发异常,则它对于必须执行的代码很有用。

我感到困惑的是,如果 try 子句没有在 try 构造中引发异常,为什么必须执行代码——为什么不简单地让它在相同的缩进级别跟在 try/except 之后呢?我认为这将简化异常处理的选项。或者另一种询问方式是else块中的代码会做什么,如果它只是遵循 try 语句,独立于它,则不会这样做。也许我错过了一些东西,请赐教。

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

4

2 回答 2

18

只有当 中的代码没有引发异常时,else才会执行该块;try如果您将代码放在else块之外,那么无论是否有异常都会发生。此外,它发生在 之前finally,这通常很重要。

当您有一个简短的设置或验证部分可能会出错时,这通常很有用,然后是一个您使用您设置的资源的块,您不想在其中隐藏错误。您不能将代码放入其中,因为当您希望它们传播时,try错误可能会出现在子句中。except你不能把它放在构造之外,因为那里的资源肯定不可用,要么是因为设置失败,要么是因为finally一切都被破坏了。因此,您有一个else障碍。

于 2013-08-22T17:59:19.597 回答
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
于 2013-08-22T18:08:50.673 回答