异常处理中的else和finally的作用

84 投票
6 回答
23535 浏览
提问于 2025-04-16 17:55

在处理异常的时候,elsefinally这两个部分是不是多余的呢?比如,下面这两段代码有什么区别吗?

try:
    foo = open("foo.txt")
except IOError:
    print("error")
else:
    print(foo.read())
finally:
    print("finished")

还有

try:
    foo = open("foo.txt")
    print(foo.read())
except IOError:
    print("error")
print("finished")

更一般来说,else里的内容不可以直接放到try里面吗?而finally里的内容不可以直接放到try/catch块外面吗?如果可以的话,elsefinally的作用是什么呢?难道只是为了让代码更易读吗?

6 个回答

14

无论发生什么情况,finally 里面的代码总是会被执行。即使之前的代码出现了错误没有处理,或者处理错误的代码自己又产生了新的错误。

15

如果你把else块里的内容放到try块里,那么在else块中发生的错误也会被捕捉到。比如说,

print(foo.read())

如果你示例中的这一行出现了IOError(输入输出错误),那么你的第一个代码片段就捕捉不到这个错误,而第二个片段可以捕捉到。通常来说,我们希望try块尽量小,这样才能只捕捉到我们想要处理的错误。

不管发生什么,finally块总是会被执行。举个例子,如果try块里有一个return语句,finally块依然会被执行,而在整个try/except块下面的代码就不会被执行了。

76

finally 这部分的代码无论在 try 块里的代码是成功还是失败都会被执行。而 else 只有在 try 块里的代码没有出现错误的时候才会执行。

撰写回答