鱼C论坛

 找回密码
 立即注册
查看: 2928|回复: 11

异常处理关于finally语句错了吗?

[复制链接]
发表于 2017-7-14 10:25:01 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 cjb2008508 于 2017-7-14 14:10 编辑

小甲鱼老师讲解final时的代码如截图所示,
Finally:
        f.close()
但是尝试几次发现文件并没有保存。

按照finally语句用于程序检查异常后仍能执行,那么如果想要保存文件更改内容应该把打开文件,写入文件然后close掉文件整体移到finally之后才能保存吧。

1.按照小甲鱼老师代码操作如图,发现内容并未保存:
QQ截图20.png

2.按照如下语句输入之后发现最后正常保存:
QQ截图3.png

try:              #结合except使用目的是检验代码异常并归类输出相关信息
   
    f = open('tip3.txt','wt')      #用可写权限打开一个名叫tip3.txt文件
    print(f.write('i hay too'))      #打印出写入f 文件内容的字节数       
    file                    #此处的file未被定义,程序运行至此会报错‘name 'file' is not defined’
    f.close()           #保存并关闭f文件
except (OSError,TypeError,NameError) as reason:      #结合try检验代码是否有错
    print('出错了\n错误原因'+str(reason))                     #file没有定义会报错并显示出‘name 'file' is not defined’

finally:                  #在程序检测异常之后任然执行语句
    f = open('tip3.txt','wt')
    print(f.write('i hay too'))    #在try中程序报错后仍然执行tip3文件更改
    f.close()   #关闭文件

综上所述小甲鱼老师是不是讲错了呢?


update:1.更新以上程序代码的注解,希望各位鱼友理解这段代码的初衷是关于程序的异常处理
               2.各位鱼友指正之前程序里面close没有带小括号,目前已经加上,但我发现close在程序中没有小括号也似乎能保存并关闭文件。
               3.再次验证发现,finally之后的语句即报错后继续执行在文件中更新内容,及时没有close(),该文件任然能正常保存并退出。代码如下:

新问题:哪位大神可否告知在finally之后系统会自动关闭打开的文件吗?为什么注释掉close()之后文件仍然可以正常写入呢?


try:
   
    f = open('tip3.txt','wt')
    print(f.write('without close'))
    file
    f.close
except (OSError,TypeError,NameError) as reason:
    print('出错了\n错误原因'+str(reason))

finally:
    f = open('tip3.txt','wt')
    print(f.write('without close'))
   # close() 注释掉之后任然可以更改并退出文件
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-7-14 10:27:43 | 显示全部楼层
由于每天只能上传3个附件,小甲鱼老师截图附件无法发表,附上视频时间节点可供大家查看 :033异常处理2-> 12:54秒处可查看老师代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-14 10:31:33 | 显示全部楼层
本帖最后由 SixPy 于 2017-7-14 10:32 编辑

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

使用道具 举报

发表于 2017-7-14 11:00:22 | 显示全部楼层
你自己少打了个小括号啊……

搜狗截图20170714105950.png

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

使用道具 举报

发表于 2017-7-14 11:31:27 | 显示全部楼层
括号虽小,上能破天,下能毁地
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-14 11:39:03 | 显示全部楼层
小甲鱼 发表于 2017-7-14 11:00
你自己少打了个小括号啊……

不好意思我附带的close没有带(),但是我的问题是小甲鱼老师的finally 直接接close(),并不能保存错误代码之后的程序。不知道这么解释是否清楚。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-14 11:42:20 | 显示全部楼层
SixPy 发表于 2017-7-14 10:31
finally:
        f.close()

刚刚又试了一下,我的close没有带括号但是还是可以正常保存更改内容的,哪位大神解释一下,close后面的括号不是必须的吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-14 11:47:00 | 显示全部楼层
小甲鱼 发表于 2017-7-14 11:00
你自己少打了个小括号啊……

小甲鱼老师,现在有2个问题,第一是按照您的方式finally后面只有close() 的话,打开文件可以关闭但是并没有执行更改的动作,您的视频当中这一段讲解说是可以写入内容的。
第二就是我发现我的代码在finally后面除了添加close,还加上了打开并更改原文件的代码,虽然close后面没有带上小括号,但是文件内容依然可以写入,详情见截图2,请问close后面的小括号不是强制的吗?python版本3.5.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-14 12:45:02 | 显示全部楼层
cjb2008508 发表于 2017-7-14 11:42
刚刚又试了一下,我的close没有带括号但是还是可以正常保存更改内容的,哪位大神解释一下,close后面的括 ...

不可能,不带括号他就不是函数,你搞错了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-14 12:45:35 | 显示全部楼层
cjb2008508 发表于 2017-7-14 11:47
小甲鱼老师,现在有2个问题,第一是按照您的方式finally后面只有close() 的话,打开文件可以关闭但是并没 ...

函数后面必须加括号吧。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-14 12:53:08 | 显示全部楼层
你在代码里面写一个 file是要干嘛,没看见一直异常说not defind吗,你这file是什么东西
还有f.close不是调用函数,而是查看这个函数的信息(不知道这样说准不准确)
如图
QQ截图20170714125459.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-14 13:04:02 | 显示全部楼层
刚刚翻了一下书,自己试了一下,想起Python是有垃圾处理机制的,当不再引用文件是系统会自动close(),就是说你执行一次程序结束之后其实已经close()了,是系统干的,不关你的close的事,懂吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-22 10:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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