是else和finally异常处理部分多余的?例如,以下两个代码段之间有什么区别吗?
try:
foo = open("foo.txt")
except IOError:
print("error")
else:
print(foo.read())
finally:
print("finished")
Run Code Online (Sandbox Code Playgroud)
和
try:
foo = open("foo.txt")
print(foo.read())
except IOError:
print("error")
print("finished")
Run Code Online (Sandbox Code Playgroud)
更一般地说,不能将内容else总是移入try,而不能将内容finally移到try/catch块之外?如果是这样,是什么目的else和finally?它只是为了增强可读性吗?
如果移动else块内部try块的内容,您还将捕获else块中可能发生的异常.如果行
print(foo.read())
Run Code Online (Sandbox Code Playgroud)
在你的例子中抛出一个IOError,你的第一个代码片段将不会捕获该错误,而你的第二个代码片段将会.您尝试尽可能地保持try块尽可能小,以便真正捕获您想要捕获的异常.
finally无论如何,块总是被执行.例如,如果try块包含return语句,finally则仍将执行块,而整个try/ except块下面的任何代码都不会执行.
try:
print("I may raise an exception!")
except:
print("I will be called only if exception occur!")
else:
print("I will be called only if exception didn't occur!")
finally:
print("I will be called always!")
Run Code Online (Sandbox Code Playgroud)