python - 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:
.....
谢谢,克里斯
解决方案
您的代码是正确的;当块退出时,它不能区分错误open
和(隐式)错误(也不能区分块中任何其他文件操作的错误),但它会捕获所有此类错误。当您到达该块时,您可以保证该文件尝试过(自动关闭将在您到达它之前发生,无论是通过失败还是引发异常),但如果在您的选项期间发生异常是有限的(因为从失败中有意义地恢复通常是不可能的)。close
with
except
close
with
close
close
请注意,这IOError
并不完全正确;在 Py3 上,它将按预期工作(它是 的别名OSError
,这是您要捕获的实际基本异常),而在 Python 2 上,它与 分开OSError
,这意味着您不会捕获OSError
或其子类(在 Windows 上很常见)特别是系统)。
如果您想明确地捕获所有此类错误,则需要 catch EnvironmentError
,它是 Python 2 和 Python 2 的超类,也是IOError
Python 3OSError
的别名OSError
;如果不考虑可移植性,那么OSError
Py3 上实际使用的名称就是这个名称,所以您也可以使用记录在案的名称。
推荐阅读
- angular - Angular 指令 - 访问子级
- java - 遗传算法 - N 皇后问题 - 对角线冲突
- go - golang实现全文搜索的高效方法
- linux-kernel - 从 /dev/kmem 读取 init_stack task_struct
- ocaml - 为什么这个 ocaml 片段会导致堆栈溢出?
- python - DQN 算法在 CartPole-v0 上不收敛
- oracle - 更新值后如何在不取消更新的情况下发送消息
- php - JSONArray 对 android Volley 响应的问题
- kubernetes - 如何在集群角色中只分配 1 个密钥?
- spring - 在 Test Corda vault 中获取所有状态时的元数据过多