Python中with语句内部的file.close()异常处理

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]) 然后你检

我知道在Python中,
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和磁盘配额中尤其明显

C
close()
函数的非零返回值会导致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或先打开文件对象,然后将其用作上下文管理器。