我是 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/