为什么异常参数没有被 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 块本身中做这些事情。
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 块本身中做这些事情。