我在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:
.....
谢谢, 克里斯
答案 0 :(得分:3)
您的代码是正确的;当open
块退出时,它无法区分close
上的错误和with
上的错误(也不区分该块中其他文件操作的错误),但是它将捕获所有此类错误。到达except
块时,可以保证文件尝试到close
(with
会在到达之前自动关闭(无论是通过失败还是提出异常),尽管如果在close
期间发生了异常,则您的选择是有限的(因为通常无法从close
失败中进行恢复)。
请注意,IOError
并不完全正确;在Py3上它将按预期运行(这是OSError
的别名,这是您要捕获的实际基本异常),而在Python 2上,它与OSError
分开,这意味着您不会捕获OSError
或其子类(尤其是在Windows系统上很常见)。
如果您想确定可移植地捕获所有此类错误,则想捕获EnvironmentError
,这是Python上IOError
和OSError
的超类2,以及Python 3上OSError
的别名;如果不考虑可移植性,那么OSError
是Py3上实际使用的名称,因此您也可以使用记录的名称。
答案 1 :(得分:1)
检查this answer,有一条评论说您可以单独打开文件以查找打开时的错误,然后将其用作上下文管理器,并再次尝试如下操作:
try:
f = open( ... )
except IOError:
...
try:
with f:
...
except IOError:
...