对try except b使用python“with”语句

2024-03-28 16:35:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

EDIT2:前面的几个答案一般都谈到了使用“with”的好处,但这里的那些似乎是边际效益。多年来,我们一直(或者应该)显式地调用f.close()。我认为一个好处是,草率的程序员将受益于使用“with”。


Tags: 方法代码closereadlineaswith方式line
3条回答

如果finally块的内容由正在打开的文件对象的属性决定,为什么文件对象的实现者不应该是编写finally块的实现者?这是with语句的好处,比在这个特定实例中节省三行代码多得多。

是的,组合withtry-except的方法几乎是唯一的方法,因为open语句本身引起的异常错误无法在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语句。

我认为你误解了“with”的说法,它只会减少行数。 它实际上执行初始化和处理拆卸。

在你的情况下“with”是

  • 打开一个文件
  • 处理其内容,以及
  • 一定要把它关上。

这里是理解“with”语句的链接:http://effbot.org/zone/python-with-statement.htm

编辑:是的,您使用的“with”是正确的,两个代码块的功能是相同的。 关于为什么使用“with”的问题?这是因为你从中得到的好处。就像你提到的意外丢失f.close()一样。

相关问题 更多 >