Python 在文件关闭时捕获异常的正确方法

标签 python with-statement ioerror

我是 Perl 老手,Python 新手。我知道在 Perl 中 fd.close() 不是无关紧要的。写满文件系统,close()会报错。同样对于套接字错误,它们出现在 close() 中。那么在 Python 中如何处理呢?一些示例显示将 open() 和 close() 放在同一个 try block 中,这会在其中一个上捕获 IOError。但其他示例在 finally block 中显示 close() 以在异常时关闭文件。但是,如果异常首先出现在close()中怎么办?

这是否涵盖了这两个要求? (1) 始终关闭文件 (2) 捕获所有 IO 异常?

try:
    with open(FILE, 'w') as fd:
        .....
except IOError as err:
    .....

谢谢, 克里斯

最佳答案

你的代码是正确的;它无法区分 open 上的错误来自(隐式)close 上的错误当with block 退出(也不区分块中任何其他文件操作的错误),但它会捕获所有此类错误。当您到达 except 时 block ,你保证文件尝试close (with 自动关闭将在您到达之前发生,无论是通过 fallthrough 还是引发异常),但如果异常发生在 close 期间您的选择是有限的(因为从 close 失败中有意义地恢复通常是不可能的)。

请注意 IOError不完全正确;在 Py3 上它将按预期工作(它是 OSError 的别名,这是您要捕获的实际基本异常),而在 Python 2 上它与 OSError 分开,这意味着你不会 catch OSError或其子类(尤其是在 Windows 系统上常见)。

如果您想明确地可移植地捕获所有此类错误,您需要捕获 EnvironmentError , 这是 IOError 的父类(super class)和 OSError在 Python 2 上,以及 OSError 的别名在 Python 3 上;如果便携性不是问题,那么 OSError是在 Py3 上实际使用的名称,因此您也可以使用记录的名称。

关于Python 在文件关闭时捕获异常的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53215714/

相关文章:

python - 如何在 python 中将字符串转换为不同的格式?

Python、bottle,现在开始调试

postgresql - PostgreSQL启动错误: “Could not flush dirty data: Input/output error”

actionscript-3 - 如何处理 AS3 中启用 HTML 的文本字段的错误

python - 抓取与 'p' 标签关联的 'tr class' 标签值

python - 用于内置操作的新样式类属性搜索

python - 即使 __init__ 方法有效,python 中的 With 语句也返回 None 对象

testing - WithClauseError, Elixir 单元测试匹配(:ok,值}

python - 如何使用 "with"调用 tempfile.mkstemp() ? - 或者为什么它不返回带有 __exit__() 的 fd?

python - 如何在 Mac OS X 上摆脱 'IOError: 13, ' Permission denied''