Python中with语句内部的file.close()异常处理
我知道在Python中,Python中with语句内部的file.close()异常处理,python,python-3.x,file-handling,Python,Python 3.x,File Handling,我知道在Python中,file.close()方法没有任何返回值,但是我找不到任何关于在某些情况下是否抛出异常的信息。如果它也不这样做,那么我想这个问题的第二部分是多余的 如果是这样,那么处理file.close()方法的“正确”方法是什么?在用于打开文件的“with”语句中抛出异常 是否存在文件打开并成功读取后,file.close()会立即失败的情况?您可以使用 file object = open(file_name [, access_mode][, buffering]) 然后你检
file.close()
方法没有任何返回值,但是我找不到任何关于在某些情况下是否抛出异常的信息。如果它也不这样做,那么我想这个问题的第二部分是多余的
如果是这样,那么处理file.close()
方法的“正确”方法是什么?在用于打开文件的“with”语句中抛出异常
是否存在文件打开并成功读取后,file.close()
会立即失败的情况?您可以使用
file object = open(file_name [, access_mode][, buffering])
然后你检查一下
file.closed
如果文件已关闭,则返回True;否则返回false。
close
会引发异常,例如,如果文件试图刷新上次写入时磁盘空间不足,或者您拔出了文件所在的U盘
至于正确的处理方法,这取决于您的应用程序的细节。也许您想向用户显示一条错误消息。也许你想关闭你的程序。也许你想重试你正在做的任何事情,但是使用不同的文件。无论您选择什么样的响应,它都可能会通过一个try
-来实现,除了程序中最适合处理它的那一层中的块。是的,file.close()
可以抛出一个IOError
异常。例如,当文件系统使用配额时,可能会发生这种情况。见:
不检查close()
的返回值是一个常见但严重的编程错误。很可能在最后一次close()
时首先报告先前write(2)
操作中的错误。关闭文件时不检查返回值可能会导致数据无声丢失。这在NFS和磁盘配额中尤其明显
Cclose()
函数的非零返回值会导致Python引发一个IOError
异常
如果要处理此异常,请在with
语句周围放置一个try…except
块:
try:
with open(filename, mode) as fileobj:
# do something with the open file object
except IOError as exc:
# handle the exception
当然,打开时也可能抛出IOError
。如果您使用的是Python 2.5或更高版本,则带有的块将自动为您关闭文件。在这种情况下,不需要显式地声明close()
。@Daniel,OP使用Python3.x标记@Bitrex如果发生错误,可以通过将with
语句包装为try:Exception异常来打印错误,e:print(e)
with语句可以抛出异常,除非包装为try/Exception。被提议但被否决了。with语句是简单用例的语法糖,在这种情况下不需要任何异常。有关详细讨论,请参阅。这甚至还没有开始回答以下问题:file.close()
是否引发异常?OP并不是询问如何检查文件对象是否打开或关闭;欢迎来到SO。当你在网站上回答问题时,记得在提交答案之前仔细阅读。或者,当您赢得足够的声誉时,您可以对该问题留下评论。当然,IOError也可能在打开时抛出。
在这种情况下,您可以使用来确保它是。@Navith或先打开文件对象,然后将其用作上下文管理器。