file.close() exception handling inside a with statement in Python
我知道在python中,file.close()方法没有任何返回值,但在某些情况下,我找不到关于它是否引发异常的任何信息。如果它也不这样做,那么我猜这个问题的第二部分是多余的。
如果是这样,那么处理file.close()方法的"正确"方法是什么?该方法在用于打开文件的"with"语句中引发异常?
在成功打开和读取文件后,是否存在file.close()可能立即失败的情况?
- 如果您使用的是python 2.5或更高版本,with块将自动为您关闭文件。在这种情况下,无需明确说明close()。
- @Daniel,op使用python 3.x标签。@Bitrex如果确实发生了错误,您可以通过用try: except Exception,e: print (e)包装with语句来打印错误。
- WITH语句可以抛出异常,除非用try/except包装,否则无法处理它们。有人提议,但被击毙了。对于没有异常的简单用例来说,WITH语句是句法上的糖分。有关扩展讨论,请参阅stackoverflow.com/questions/8774830/…。
是的,file.close()可以抛出IOError异常。例如,当文件系统使用配额时,就会发生这种情况。见c close()功能手册页:
Not checking the return value of close() is a common but nevertheless serious programming error. It is quite possible that errors on a previous write(2) operation are first reported at the final close(). Not checking the return value when closing the file may lead to silent loss of data. This can especially be observed with NFS and with disk quota.
c close()函数的非零返回值导致python引发IOError异常。
如果要处理此异常,请在with语句周围放置一个try...except块:
1 2 3 4 5
| try:
with open(filename, mode) as fileobj:
# do something with the open file object
except IOError as exc:
# handle the exception |
当然,IOError也可能在开幕式上被抛出。
- Of course, the IOError could also have been thrown during opening.在这种情况下,您使用ExitStack来确保它在退出时被提升。
- @先浏览或打开文件对象,然后将其用作上下文管理器。
close可以抛出异常,例如,如果在试图刷新上一次写入时磁盘空间不足,或者拔出文件所在的U盘。
至于正确的处理方法,这取决于应用程序的详细信息。也许您想向用户显示一条错误消息。也许你想关闭你的程序。也许你想重试你正在做的任何事情,但是用一个不同的文件。无论您选择什么样的响应,它都可能在您的程序最适合处理它的任何层中使用try--except块来实现。
你可以使用
1
| file object = open(file_name [, access_mode][, buffering]) |
然后你检查
如果文件关闭则返回true,否则返回false。
- 这甚至没有开始回答这个问题:file.close()是否抛出了任何异常?OP不会询问如何检查文件对象是打开还是关闭。
- 哦,对不起-我没读过问题。
- 一切都很好,欢迎光临。当你在网站上回答问题时,记住在提交答案之前仔细阅读它们。或者,当你获得足够的声誉时,你可以对这个问题发表评论。