当前位置: 首页 > 面试题库 >

在try-except块中使用python“ with”语句

司寇凯
2023-03-14
问题内容

这是将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”中受益。


问题答案:
  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内部所有这些语句。



 类似资料:
  • 主要内容:获取特定异常的有关信息Python 中,用 语句块捕获并处理异常,其基本语法结构如下所示: try:     可能产生异常的代码块 except [ (Error1, Error2, ... ) [as e] ]:     处理异常的代码块1 except [ (Error3, Error4, ... ) [as e] ]:     处理异常的代码块2 except  [Exception]:     处理其它异常 该

  • Python 异常处理机制还提供了一个 finally 语句,通常用来为 try 块中的程序做扫尾清理工作。 注意,和 else 语句不同,finally 只要求和 try 搭配使用,而至于该结构中是否包含 except 以及 else,对于 finally 不是必须的(else 必须和 try except 搭配使用)。 在整个异常处理机制中, finally 语句的功能是:无论 try 块是否

  • 在原本的 结构的基础上, Python 异常处理机制还提供了一个 else 块,也就是原有 try except 语句的基础上再添加一个 else 块,即 结构。 使用 else 包裹的代码,只有当 try 块没有捕获到任何异常时,才会得到执行;反之,如果 try 块捕获到异常,即便调用对应的 except 处理完异常,else 块中的代码也不会得到执行。 举个例子: 可以看到,在原有 try e

  • 我正在学习Python并偶然发现了一个我无法理解的概念:构造中的可选块。 我感到困惑的是,如果try子句没有在try构造中引发异常,为什么必须执行代码--为什么不让它在相同的缩进级别上跟随try/except?我认为这将简化异常处理的选项。或者另一种询问方法是块中的代码会做什么,如果它只是跟随try语句,而不是它,那么它就不会做什么。也许我漏掉了什么,请开导我。 这个问题和这个问题有点相似,但我找

  • 考虑来自Java文档的以下代码。 根据Java文档, 在示例readFirstLineFromFile中,如果从try块和try with resources语句抛出异常,则方法readFirstLineFromFile抛出从try块抛出的异常;禁止从try with resources块引发的异常。 另一方面,也提到了 由于BufferedReader实例是在try with resource语

  • 我们尝试读取用户的一段输入。按Ctrl-d,看一下会发生什么。 >>> s = raw_input('Enter something --> ') Enter something --> Traceback (most recent call last):   File "<stdin>", line 1, in ? EOFError Python引发了一个称为EOFError的错误,这个错误基本