python定义清理行为

1、try 语句还有另外一个可选的子句,它定义了无论在任何情况下都会执行的清理行为。 例如:
  1. >>>try:
  2. raiseKeyboardInterrupt
  3. finally:
  4. print('Goodbye, world!')
  5. Goodbye, world!
  6. Traceback(most recent call last):
  7. File"<pyshell#71>", line 2,in<module>
  8. raiseKeyboardInterrupt
  9. KeyboardInterrupt
以上例子不管try子句里面有没有发生异常,finally子句都会执行。
 
2、如果一个异常在 try 子句里(或者在 except 和 else 子句里)被抛出,而又没有任何的 except 把它截住,那么这个异常会在 finally 子句执行后再次被抛出。
下面是一个更加复杂的例子(在同一个 try 语句里包含 except 和 finally 子句):
  1. >>>def divide(x, y):
  2. try:
  3. result = x / y
  4. exceptZeroDivisionError:
  5. print("division by zero!")
  6. else:
  7. print("result is", result)
  8. finally:
  9. print("executing finally clause")
  10. >>> divide(2,1)
  11. result is2.0
  12. executing finally clause
  13. >>> divide(2,0)
  14. division by zero!
  15. executing finally clause
  16. >>> divide("2","1")
  17. executing finally clause
  18. Traceback(most recent call last):
  19. File"<pyshell#91>", line 1,in<module>
  20. divide("2","1")
  21. File"<pyshell#88>", line 3,in divide
 
3、预定义的清理行为
一些对象定义了标准的清理行为,无论系统是否成功的使用了它,一旦不需要它了,那么这个标准的清理行为就会执行。
这面这个例子展示了尝试打开一个文件,然后把内容打印到屏幕上:
  1. >>>for line in open("myfile.txt"):
  2. print(line, end="")
  3. Traceback(most recent call last):
  4. File"<pyshell#94>", line 1,in<module>
  5. for line in open("myfile.txt"):
  6. FileNotFoundError:[Errno2]No such file or directory:'myfile.txt'
以上这段代码的问题是,当执行完毕后,文件会保持打开状态,并没有被关闭。
关键词 with 语句就可以保证诸如文件之类的对象在使用完之后一定会正确的执行他的清理方法:
  1. >>>with open("myfile.txt")as f:
  2. for line in f:
  3. print(line, end="")
  4. Traceback(most recent call last):
  5. File"<pyshell#98>", line 1,in<module>
  6. with open("myfile.txt")as f:
  7. FileNotFoundError:[Errno2]No such file or directory:'myfile.txt'
以上这段代码执行完毕后,就算在处理过程中出问题了,文件 f 总是会关闭。

猜你喜欢

转载自cakin24.iteye.com/blog/2383336