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

file.close() exception handling inside a with statement in Python

我知道在python中,file.close()方法没有任何返回值,但在某些情况下,我找不到关于它是否引发异常的任何信息。如果它也不这样做,那么我猜这个问题的第二部分是多余的。

如果是这样,那么处理file.close()方法的"正确"方法是什么?该方法在用于打开文件的"with"语句中引发异常?

在成功打开和读取文件后,是否存在file.close()可能立即失败的情况?


是的,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也可能在开幕式上被抛出。


close可以抛出异常,例如,如果在试图刷新上一次写入时磁盘空间不足,或者拔出文件所在的U盘。

至于正确的处理方法,这取决于应用程序的详细信息。也许您想向用户显示一条错误消息。也许你想关闭你的程序。也许你想重试你正在做的任何事情,但是用一个不同的文件。无论您选择什么样的响应,它都可能在您的程序最适合处理它的任何层中使用try--except块来实现。


你可以使用

1
file object = open(file_name [, access_mode][, buffering])

然后你检查

1
file.closed

如果文件关闭则返回true,否则返回false。