是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)