异常处理中的else和finally的作用
在处理异常的时候,else
和finally
这两个部分是不是多余的呢?比如,下面这两段代码有什么区别吗?
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
块外面吗?如果可以的话,else
和finally
的作用是什么呢?难道只是为了让代码更易读吗?
6 个回答
14
无论发生什么情况,finally
里面的代码总是会被执行。即使之前的代码出现了错误没有处理,或者处理错误的代码自己又产生了新的错误。
15
如果你把else
块里的内容放到try
块里,那么在else
块中发生的错误也会被捕捉到。比如说,
print(foo.read())
如果你示例中的这一行出现了IOError
(输入输出错误),那么你的第一个代码片段就捕捉不到这个错误,而第二个片段可以捕捉到。通常来说,我们希望try
块尽量小,这样才能只捕捉到我们想要处理的错误。
不管发生什么,finally
块总是会被执行。举个例子,如果try
块里有一个return
语句,finally
块依然会被执行,而在整个try
/except
块下面的代码就不会被执行了。
76
finally
这部分的代码无论在 try
块里的代码是成功还是失败都会被执行。而 else
只有在 try
块里的代码没有出现错误的时候才会执行。