python - 使用带有 try-except block 的 python "with"语句

标签 python finally with-statement try-catch except

这是将python“with”语句与try-except block 结合使用的正确方法吗?:

try:
    with open("file", "r") as f:
        line = f.readline()
except IOError:
    <whatever>

如果是,那么考虑旧的做事方式:

try:
    f = open("file", "r")
    line = f.readline()
except IOError:
    <whatever>
finally:
    f.close()

这里的“with”语句的主要好处是我们可以摆脱三行代码吗? 这个用例对我来说似乎没有什么吸引力(尽管我知道“with”语句还有其他用途)。

编辑:以上两段代码的功能是否相同?

EDIT2:前几个答案一般都在谈论使用“with”的好处,但这些似乎是边际 yield 。多年来,我们都(或应该)明确地调用 f.close()。我想一个好处是马虎的编码员会从使用“with”中受益。

最佳答案

  1. 您提供的两个代码块是 等效
  2. 您描述为 旧方式的代码 of doing things有一个严重的bug: 万一打开文件失败 将在 finally 子句,因为 f 不是 绑定(bind)。

等效的旧式代码是:

try:
    f = open("file", "r")
    try:
        line = f.readline()
    finally:
        f.close()
except IOError:
    <whatever>

如您所见,with 语句可以减少出错的可能性。在较新版本的 Python(2.7、3.1)中,您还可以在一个 with 语句中组合多个表达式。例如:

with open("input", "r") as inp, open("output", "w") as out:
    out.write(inp.read())

除此之外,我个人认为尽早捕获任何异常是一种坏习惯。这不是异常(exception)的目的。如果可能失败的 IO 函数是更复杂操作的一部分,则在大多数情况下 IOError 应该中止整个操作,因此在外部级别进行处理。使用 with 语句,您可以在内部级别摆脱所有这些 try...finally 语句。

关于python - 使用带有 try-except block 的 python "with"语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3642080/

相关文章:

python - 时间数据 '2018-06-19 11:21:13.311' 与格式不匹配

python - 从脚本导入安装的包会引发 "AttributeError: module has no attribute"或 "ImportError: cannot import name"

Python - 无法从 __future__ 导入 with_statement

python - 返回用 open 打开的文件句柄?

python - 用 with 语句关闭后重新打开 sys.stdout

python - 对二维 numpy 数组中的每个 NXN 子数组执行计算的最快方法

python - 为什么我在 Pygame 的 Pong 游戏中球不反弹?

java - finally 和 no finally 和有什么不一样?

Angular 6/Rxjs - 如何基础 : observables success, 错误,最后

loops - Powershell try catch 并重试?