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

时间:2018-11-08 20:33:03

标签: python with-statement ioerror

我在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:
    .....

谢谢, 克里斯

2 个答案:

答案 0 :(得分:3)

您的代码是正确的;当open块退出时,它无法区分close上的错误和with上的错误(也不区分该块中其他文件操作的错误),但是它将捕获所有此类错误。到达except块时,可以保证文件尝试closewith会在到达之前自动关闭(无论是通过失败还是提出异常),尽管如果在close期间发生了异常,则您的选择是有限的(因为通常无法从close失败中进行恢复)。

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

如果您想确定可移植地捕获所有此类错误,则想捕获EnvironmentError,这是Python上IOErrorOSError的超类2,以及Python 3上OSError的别名;如果不考虑可移植性,那么OSError是Py3上实际使用的名称,因此您也可以使用记录的名称。

答案 1 :(得分:1)

检查this answer,有一条评论说您可以单独打开文件以查找打开时的错误,然后将其用作上下文管理器,并再次尝试如下操作:

try:
    f = open( ... )
except IOError:
    ...
try:
    with f:
        ...
except IOError:
    ...