首页 > 解决方案 > Python在文件关闭时捕获异常的正确方法

问题描述

我对 Perl 很老,对 Python 很陌生。我知道在 Perl 中 fd.close() 并非无关紧要。写入一个完整的文件系统,close() 会报错。同样对于套接字错误,它们出现在 close() 中。那么如何在 Python 中使用呢?一些示例显示将 open() 和 close() 放在同一个 try 块中,这会在其中任何一个上捕获 IOError。但其他示例在 finally 块中显示 close() 以在异常时关闭文件。但是,如果异常首先发生在 close() 中怎么办?

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

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

谢谢,克里斯

标签: pythonwith-statementioerror

解决方案


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

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

如果您想明确地捕获所有此类错误,则需要 catch EnvironmentError,它是 Python 2 和 Python 2 的超类,也是IOErrorPython 3OSError的别名OSError;如果不考虑可移植性,那么OSErrorPy3 上实际使用的名称就是这个名称,所以您也可以使用记录在案的名称。


推荐阅读