[英]Using python “with” statement with try-except block
这是将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”中受益。
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
语句的好处,远不止在这个特定实例中保存三行代码。
是的,你结合with
和try-except
方式几乎是唯一的方法,因为在open
语句中引起的异常错误不能在with
块中捕获。
我认为你对“with”声明说错了它只会减少线条。 它实际上做了初始化和处理拆解。
在你的情况下“与”做
以下是理解“with”声明的链接: http : //effbot.org/zone/python-with-statement.htm
编辑:是的,您对“with”的使用是正确的,两个代码块的功能是相同的。 关于为何使用“with”的问题? 这是因为你得到的好处。 就像你提到的意外丢失了f.close()。
以下代码的Pythonic方式更多:
try:
f = open("file", "r")
try:
line = f.readline()
finally:
f.close()
except IOError:
<whatever>
try:
f = open("file", "r")
except IOError:
<whatever>
else:
f.close()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.