else的目的,最后是异常处理的目的


74

异常处理的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块之外吗?如果是的话,elseand的目的是finally什么?只是为了提高可读性?

Answers:


68

finally无论try块中的语句是成功还是失败,都将执行。else仅在try块中的语句未引发异常时才执行。


哇,这太容易理解了,谢谢,下!:)
Varun Rathore

最后的用途是什么?我们也可以在try-except块之外打印“ finally ”。无法理解它将产生的差异
Amol Gupta

13

如果在else块内移动块的内容,try还将捕获在else块执行期间可能发生的异常。如果行

print(foo.read())

在您的示例中抛出IOError,您的第一个代码段将不会捕获该错误,而您的第二个代码段将捕获该错误。try通常,您尝试使块尽可能地小,以真正只捕获要捕获的异常。

finally无论如何,该块始终执行。例如,如果该try块包含一条return语句,finally则仍将执行一个块,而整个try/except块下面的任何代码都不会执行。


12

无论发生什么情况,finally 始终执行该块。即使未处理异常,或者异常处理程序本身也会生成新的异常。


2
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!")

0

finally 块总是执行

Else 如果没有任何异常,则执行块。

我更喜欢将代码放在finally总是在代码块之后try和代码块之外执行的代码块中。

我更喜欢将代码放在else如果try子句不会引发像这样的异常的情况下执行的代码块中

最后

try:
  f = open("file.txt")
  f.write("change file")
except:
  print("wrong")
finally:
  f.close()

其他

try:
   f = open("file.txt")
   f.write("change file")
except:
  print("wrong")
else:
  print("log => there is not any exception")
finally:
    f.close()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.