【问题标题】:file.close() exception handling inside a with statement in PythonPython 中 with 语句中的 file.close() 异常处理
【发布时间】:2015-10-24 08:01:20
【问题描述】:

我知道在 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/except,但被否决了。 with 语句是没有异常的简单用例的语法糖。请参阅stackoverflow.com/questions/8774830/… 进行扩展讨论。

标签: python python-3.x file-handling


【解决方案1】:

是的,file.close() 可以抛出 IOError 异常。例如,当文件系统使用配额时,就会发生这种情况。见C close() function man page

不检查close() 的返回值是一个常见但严重的编程错误。很可能之前的write(2) 操作中的错误首先在最后的close() 中报告。关闭文件时不检查返回值可能会导致数据无声丢失。这在 NFS 和磁盘配额中尤其明显。

C close() 函数的非零返回值导致 Python 引发 IOError 异常。

如果您想处理此异常,请将try...except围绕 with 语句:

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 来确保它是raised when exiting
  • @Navith 或先打开文件对象,然后然后将其用作上下文管理器。
【解决方案2】:

close 可能会引发异常,例如,如果您在尝试刷新上次写入时磁盘空间不足,或者如果您拔出文件所在的 U 盘。

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

【讨论】:

    【解决方案3】:

    你可以使用

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

    然后你检查

    file.closed
    

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

    【讨论】:

    • 这甚至没有开始回答这个问题file.close() 是否抛出任何异常? OP 询问如何检查一个文件对象是打开还是关闭。
    • 一切都好;欢迎来到SO。当您在网站上回答问题时,请记住在提交答案之前仔细阅读它们。或者,当您获得足够的声望时,您可以对问题发表评论。
    猜你喜欢
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多