【问题标题】:why is exception argument not caught by finally block in python为什么python中的finally块没有捕获异常参数
【发布时间】:2015-06-16 00:27:14
【问题描述】:
try:
    ...
except (SomeError) as err:
    ...
else:
    ...
finally:
    if err:
   ...

这给出了一个错误:'err not defined'。因为就 finally 块而言,异常参数 - err - 没有定义。那么似乎异常参数是异常块的本地参数。

您可以通过将 err 复制到块外定义的另一个变量来绕过它:

teleport = ""
try:
    ...
except (SomeError) as err:
    teleport = err
else:
    ...
finally:
    if teleport:
        ...

但是为什么不能简单地引用 finally 块中的异常参数呢? (假设我没有忽略其他东西。)

【问题讨论】:

  • 并且引发了异常,对吧?
  • 分配teleport = ""的意义何在?字符串是不可变的
  • @Pynchia 可能会阻止 NameError 被提出。
  • 哦,是的。抱歉,被倒置检查卡住了
  • @Pynchia 这一切都很好。 :D

标签: python exception scope finally try-except


【解决方案1】:

try 块将执行可能引发异常的代码。 except 块将在引发异常的那一刻执行。 else 块在没有引发异常时执行,finally 块无论如何都会执行。

当您可以在 else 块中检查异常时,检查 finally 块中的异常是没有意义的。

除此之外,该变量很可能在except 块的执行结束时被垃圾收集。这类似于with 块的情况。这就是为什么你不能做if err:

【讨论】:

  • with 块在执行后不会进行垃圾收集。试试看:with open("a.txt", "w') as a: passa
  • 嗯,是的,他们不会进行垃圾收集,但我相信他们使用上下文管理器或类似的东西。本质上,它会调用 a.close() 类似的东西
  • The else block executes if no except is raised 所以在那里检查也没有意义。
  • 这不是问题的答案。这是另一个问题,伪装成一个聪明的答案。既然你问了,我就是在查询一个网页:我想处理状态码,不管它是否出错。我决定使用相同的变量在发生错误(除了)或不(否则)时捕获它。这使我的处理(最终)更简单、更整洁。如果我试图在 finally 块中引用异常参数,则会引发“变量未定义”错误。因此,我很想知道为什么它会这样工作。我知道它是如何工作的,谢谢。我的问题是它为什么会这样。
  • 如果您的问题是为什么会这样,那么我已经在上一段中回答了您的问题。
【解决方案2】:

您无法访问,因为没有引发异常,因此没有定义变量,因此未定义变量错误。除了在你的最后一个块中处理异常没有意义,你应该在 except 块本身中做这些事情。

【讨论】:

  • 虽然是一个很好的猜测,而且在很多情况下都是正确的,但这看起来不像。尝试自己引发异常。
  • 你在说什么,如果没有引发异常,否则将执行块,并且显然不会初始化 err 变量。
  • 引发异常,然后不引发异常。试试看。
  • 好的,当我可以访问计算机时,我会检查它,但是为什么要在 finally 的情况下访问异常。这显然闻起来很腥。
  • 原因有很多,但finally块的主要用途是清理操作,或者强制操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 2010-09-07
  • 2017-06-18
  • 2016-02-03
  • 2015-05-08
  • 2011-11-28
  • 2022-01-06
相关资源
最近更新 更多