鱼C论坛

 找回密码
 立即注册
查看: 6882|回复: 7

不太理解异常语句finally的作用到底在哪里?

[复制链接]
发表于 2016-1-8 18:57:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
@小甲鱼 视频例子中关于异常有这样一段程序:
  1. try:
  2.     f = open('我为什么是一个文件.txt', 'w')
  3.     print(f.write('我存在了!'))
  4.     sum = 1 + '1'
  5. except (OSError, TypeError):
  6.     print('出错了T_T')
  7. finally:
  8.     f.close()
复制代码


如果写成:
  1. try:
  2.     f = open('我为什么是一个文件.txt', 'w')
  3.     print(f.write('我存在了!'))
  4.     sum = 1 + '1'
  5. except (OSError, TypeError):
  6.     print('出错了T_T')
  7. f.close()
复制代码


效果不是一样吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-1-8 19:21:37 | 显示全部楼层
区别就在于,有finally关键字的时候,Python遇到错误在向你甩出错误之前还会留一口气先执行完finally里面的语句,看看文档是怎么说的吧~
  1. >>> def divide(x, y):
  2. ...     try:
  3. ...         result = x / y
  4. ...     except ZeroDivisionError:
  5. ...         print("division by zero!")
  6. ...     else:
  7. ...         print("result is", result)
  8. ...     finally:
  9. ...         print("executing finally clause")
  10. ...
  11. >>> divide(2, 1)
  12. result is 2.0
  13. executing finally clause
  14. >>> divide(2, 0)
  15. division by zero!
  16. executing finally clause
  17. >>> divide("2", "1")
  18. executing finally clause
  19. Traceback (most recent call last):
  20.   File "<stdin>", line 1, in ?
  21.   File "<stdin>", line 3, in divide
  22. TypeError: unsupported operand type(s) for /: 'str' and 'str'
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +5 收起 理由
冬雪雪冬 + 5 + 5 + 5 感谢楼主无私奉献!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-8 20:50:44 | 显示全部楼层
hldh214 发表于 2016-1-8 19:21
区别就在于,有finally关键字的时候,Python遇到错误在向你甩出错误之前还会留一口气先执行完finally里面的语 ...

感谢,终于明白了。如果except捕获了错误,则是否有finally没有区别。而有except未捕获的错误发生时,则在报错退出前,“留一口气先执行完finally里面的语句”。

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
hldh214 + 1 + 1 对,在代码死掉之前的最后呻吟

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-1-8 21:11:27 | 显示全部楼层
hldh214 发表于 2016-1-8 19:21
区别就在于,有finally关键字的时候,Python遇到错误在向你甩出错误之前还会留一口气先执行完finally里面的语 ...

再追问一下,不用else,而将print("result is", result)语句提前,是不是功能上没有区别?
  1. def divide(x, y):
  2.     try:
  3.         result = x / y
  4.         print("result is", result)
  5.     except ZeroDivisionError:
  6.         print("division by zero!")
  7.     print("executing finally clause")
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-8 21:31:59 | 显示全部楼层
冬雪雪冬 发表于 2016-1-8 21:11
再追问一下,不用else,而将print("result is", result)语句提前,是不是功能上没有区别?

恩,可能在性能上有区别吧,我也不是太清楚,,,照搬手册的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-9 16:18:08 | 显示全部楼层
本帖最后由 kunaiai 于 2016-1-9 17:54 编辑

try块里的代码不管有没异常 finally块的语句都会执行
    try:
        f = open('我为什么是一个文件.txt', 'w')
        print(f.write('我存在了!'))
        sum = 1 + '1'  #异常来了 后面的语句就不会执行了  f就没释放
        f.close()
    except (OSError, TypeError):
        print('出错了T_T')
    finally:
        f.close()  #放在这里是保证这句话不过有没异常都会执行 f就会释放
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-9 16:32:41 | 显示全部楼层
try:
    f = open('111.txt', 'w')
    print(id(f))
    f.write('我存在了!')
    sum = 1 + '1'
except (OSError, TypeError):
    print('出错了T_T')
finally:
    print(id(f))
    f.close()



try:
    f = open('222.txt', 'w')
    print(id(f))
    f.write('我存在了!')
    sum = 1 + '1'
except (OSError, TypeError):
    print('出错了T_T')

print(id(f))
f.close()

用idle里执行了下  一样的效果
为什么  try里的f是局域变量啊  怎么在try外面还可以访问
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-9 16:53:08 | 显示全部楼层
kunaiai 发表于 2016-1-9 16:32
try:
    f = open('111.txt', 'w')
    print(id(f))

try里不属于局部变量。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-19 04:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表