来源:强哥  公众号:Python与数据分析   链接:https://mp.weixin.qq.com/s/6jBvyl1YoVBRyVQCdC67Sg

无论try语句中是否抛出异常,finally中的语句一定会被执行。我们来看下面的例子:try:

f = open("/tmp/output", "w")

f.write("hello")

#raise Exception("something wrong")

finally:

print("closing file")

f.close()不论try中写文件的过程中是否有异常,finally中关闭文件的操作一定会执行。由于finally的这个特性,finally经常被用来做一些清理工作。

我们再来看下面的例子def func1():

try:

return 1

finally:

return 2

def func2():

try:

raise ValueError()

except:

return 1

finally:

return 3

print(func1())

print(func2())这个例子中 func1() 和 func2() 返回什么呢?答案是 func1() 返回2, func2() 返回3。为什么是这样的呢?我们先来看一段Python官网上对于finally的解释:A finally clause is always executed before leaving the try statement, whether an exception has occurred or not. When an exception has occurred in the try clause and has not been handled by an except clause (or it has occurred in a except or else clause), it is re-raised after the finally clause has been executed. The finally clause is also executed “on the way out” when any other clause of the try statement is left via a break, continue or return statement.

重点部分用粗体标出了,翻成中文就是try块中包含break、continue或者return语句的,在离开try块之前,finally中的语句也会被执行。

所以在上面的例子中,func1() 中,在try块return之前,会执行finally中的语句,try中的return被忽略了,最终返回的值是finally中return的值。func2() 中,try块中抛出异常,被except捕获,在except块return之前,执行finally中的语句,except中的return被忽略,最终返回的值是finally中return的值。

我们在上面的例子中加入print语句,可以更清楚地看到过程def func1():

try:

print 'in func1 try: try statement, will return 1'

return 1

finally:

print 'in func1 finally: try statement, will return 2'

return 2

def func2():

try:

print 'in func2 try: raise error'

raise ValueError()

except:

print 'in func2 except: caught error, will return 1!'

return 1

finally:

print 'in func2 finally: will return 3'

return 3

print func1()

print func2()上面的代码输出in func1 try: try statement, will return 1

in func1 finally: try statement, will return 2

2

in func2 try: raise error

in func2 except: caught error, will return 1!

in func2 finally: will return 3

3我们对上面的func2做一些修改,如下def func2():

try:

print 'in func2 try: raise error'

raise ValueError()

except IndexError:

print 'in func2 except: caught error, will return 1!'

return 1

finally:

print 'in func2 finally: will return 3'

return 3

print func2()输出如下in func2 try: raise error

in func2 finally: will return 3

3try中抛出的异常是ValueError类型的,而except中定位的是IndexError类型的,try中抛出的异常没有被捕获到,所以except中的语句没有被执行,但不论异常有没有被捕获,finally还是会执行,最终函数返回了finally中的返回值3。

这里还可以看到另外一个问题。try中抛出的异常没有被捕获到,按理说当finally执行完毕后,应该被再次抛出,但finally里执行了return,导致异常被丢失。

可以看到在finally中使用return会导致很多问题。实际应用中,不推荐在finally中使用return返回。

python中finally的用法_python中的finally用法相关推荐

  1. python常用函数的用法_python中常用函数整理

    1.map map是python内置的高阶函数,它接收一个函数和一个列表,函数依次作用在列表的每个元素上,返回一个可迭代map对象. class map(object):""&qu ...

  2. [转载] python中string函数的用法_python中string模块各属性以及函数的用法

    参考链接: Python中的string.octdigits 任何语言都离不开字符,那就会涉及对字符的操作,尤其是脚本语言更是频繁,不管是生产环境还是面试考验都要面对字符串的操作. python的字符 ...

  3. python map用法_Python中 map()函数的用法详解

    python map()函数问题 使用map()函数生成一个值D但是检测D的长度时,只能测一次,一次之后D似不知道你的dataSet 是什么数据,是否是从数据库取出来的结果游标, 如果是的 那么dat ...

  4. python not用法_python中not、and和or的优先级与详细用法介绍

    前言 (小白专用)本次所分享的是python中的not.and.or的执行时的优先级,以及他们的具体用法.本文比较详细,不喜勿喷. 一.not.and.or的含义以及优先级 对象 返回结果 优先顺序 ...

  5. python中try的用法_python中的 try...except...finally 的用法

    python中的 try...except...finally 的用法 author:headsen chen date:2018-04-09 16:22:11 try, except, finall ...

  6. python中strip的用法_Python中你不知道的strip()函数的妙用

    [开胃小菜] 当提到python中strip方法,想必凡接触过python的同行都知道它主要用来切除空格.有以下两种方法来实现. 方法一:用内置函数if name == 'main' : str = ...

  7. python中的datetime函数_Python datetime函数常见用法总结

    Python datetime使用指导:操作时间.日期和时间区间 在 Python 中处理日期和时间是一个很麻烦的问题.幸运的是,Python 提供了内置方法来简化这种操作:Python Dateti ...

  8. python中array的用法_Python中的numpy.array()用法

    齐次多维数组是NumPy的主要对象.它基本上是一个元素表, 这些元素都是相同类型的, 并由一个正整数元组索引.尺寸在NumPy中称为轴. NumPy的数组类称为ndarray或别名数组. numpy. ...

  9. python中的元类_Python中的元类(metaclass)

    提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自身有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理 ...

最新文章

  1. xml放在工程的那个路径下_Ubuntu下配置pyrouge
  2. 径向基RBF(radial basis function)函数、RBF神经网络、 反推(back-stepping)控制
  3. 纪中C组模拟赛总结(2019.7.12)
  4. 喷水装置2(nyoj12)
  5. 西瓜书+实战+吴恩达机器学习(二二)概率图模型之马尔可夫随机场
  6. wince flash Android,关于wince下用C#实现flash播放器
  7. Jepsen mysql_Hello Clojure - Jepsen
  8. UTF-8 encode decode 集合
  9. python银行管理系统框架_基于Python的网上银行综合管理系统的设计与实现
  10. 微信脚本配置服务器,微信自动加人脚本教程
  11. pt100热电阻计算公式C语言,pt100计算公式,PT100实际应用中的两种形式
  12. 计算机电源接口作用,计算机DIY必修课程,电源接口的详细说明
  13. azkaban 项目依赖
  14. 论文排版之参考文献的自动生成、设置格式及引用
  15. 3-2-1 程序控制结构-while循环结构-多次求解一元二次方程?-while循环常见错误?
  16. mos管的rc吸收电路计算_一种反激式开关电源中MOS管的RC吸收电路的制作方法
  17. JS中VAR的用处(局部变量要用var来声明,全局变量不加var)
  18. 被误解最大的基础学科——统计学,到底是个啥?
  19. 数学之美—泰勒展开式
  20. vpython 贞测碰撞_球碰撞vPython问题

热门文章

  1. 高压放大器在柔性材料测试中的应用
  2. Python爬虫-某家网平台二手房
  3. 未能从hitman服务器,愤怒的小鸟 2无法连接服务器是什么原因
  4. JUnit5学习之七:参数化测试(Parameterized Tests)进阶
  5. 【复习】复习之学习笔记
  6. windows10系统的软件都无法安装闪退的问题
  7. html 获取浏览器语言,js获取浏览器类型和语言
  8. Web开发人员最关注的6款HTML5代码生成器
  9. 制造业ERP失败原因探秘
  10. ios15.4系统更新导致设备续航问题苹果官方回复,附iPhone续航提升小技巧