其他目的,最后是异常处理

jho*_*ack 63 python

elsefinally异常处理部分多余的?例如,以下两个代码段之间有什么区别吗?

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块之外?如果是这样,是什么目的elsefinally?它只是为了增强可读性吗?

Bri*_*her 48

finally无论try块中的语句是失败还是成功,都会执行.else仅当try块中的语句不引发异常时才执行.


orl*_*rlp 10

无论发生什么,finally 总是会执行块.即使未处理异常或异常处理程序本身也会生成新的异常.


Sve*_*ach 9

如果移动else块内部try块的内容,您还将捕获else块中可能发生的异常.如果行

print(foo.read())
Run Code Online (Sandbox Code Playgroud)

在你的例子中抛出一个IOError,你的第一个代码片段将不会捕获该错误,而你的第二个代码片段将会.您尝试尽可能地保持try块尽可能小,以便真正捕获您想要捕获的异常.

finally无论如何,块总是被执行.例如,如果try块包含return语句,finally则仍将执行块,而整个try/ except块下面的任何代码都不会执行.


Nas*_*hah 7

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)