如何使用python“with”语句和try-except块?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (206)

这是正确的方式来使用python“with”语句结合try-except块吗?

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”语句有其他用途)。

上述两个代码块的功能是否相同?

提问于
用户回答回答于
  1. 你给出的两个代码块 并不相同
  2. 所描述的代码的代码有一个严重的错误:如果打开文件失败, 将在该finally子句中得到第二个异常, 因为f没有绑定。

等效的旧式代码将是:

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())

除此之外,我个人认为这是一个坏习惯,尽早赶上任何例外。这不是例外的目的。如果可能失败的IO函数是更复杂操作的一部分,则在大多数情况下,IOError应该中止整个操作,因此需要在外层进行处理。使用with语句,你可以摆脱try...finally内层的所有这些陈述。

用户回答回答于

如果finally块是由打开的文件对象的属性决定的,为什么文件对象的实现者不应该是编写finally街区?那是...的利益with语句,这远远超过在这个特定实例中保存三行代码。

是的,你结合起来的方式withtry-except是唯一的方法,因为在open语句本身无法在with封锁。

扫码关注云+社区

领取腾讯云代金券