为什么异常参数没有被 python 中的 finally 块捕获

why is exception argument not caught by finally block in python

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 块中引用异常参数呢? (假设我没有忽略其他事情。)

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

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

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

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