【问题标题】:Understanding Control flow in Exception Handling in Python [closed]了解 Python 中异常处理中的控制流 [关闭]
【发布时间】:2020-10-11 13:48:24
【问题描述】:
a=0
try:
    print("In Try Block !")
    a = 10/0
except Exception as e:
    print("In Exception Block !")
    raise e
finally:
    print("In Finally Block !")
    print(a)
    pass

当我运行上面的代码时,我得到如下输出。我不明白这个脚本的流程。

In Try Block !
Traceback (most recent call last):
In Exception Block !
In Finally Block !
0
  File "C:\Users\reccer\Documents\Practicals\test.py", line 7, in <module>
    raise e
  File "C:\Users\reccer\Documents\Practicals\test.py", line 4, in <module>
    a = 10/0
ZeroDivisionError: division by zero
[Finished in 0.3s with exit code 1]
  1. 进入 try 块。
  2. 发现错误
  3. 除块外进入。
  4. 打印“在异常块中!”
  5. 进入 finally 块。
  6. 打印 "In finally Block !" 并打印 a
  7. 然后从 except 块执行 raise e 的手续。

我无法获得任何关于控制流的具体参考。

【问题讨论】:

  • 一个数不能被零除
  • 您期望会发生什么?
  • 这里具体有什么不明白的?
  • @mkrieger1 我期待except 块将执行一次,然后它将进入finally 块。但正如我们所见,它执行print 语句然后转到final 块,然后返回except 块并执行raise e
  • @jarmod 上述脚本的执行流程。

标签: python exception control-flow flowchart


【解决方案1】:

流程是正确的。 finally 块在离开 try\except\finally 结构之前执行。由于您重新引发了异常,因此异常正在从结构中传递出去,因此 finally 必须先运行。

a=0
try:
    print("In Try Block !")
    a = 10/0
except Exception as e:
    print("In Exception Block !")
    raise e   # send exception up the call stack, but must run finally first 
finally:
    print("In Finally Block !")
    print(a)
    pass   # not needed

您看到的错误跟踪是由调用您的代码的代码生成的——可能是核心 python 引擎。

【讨论】:

    猜你喜欢
    • 2015-02-08
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 2011-02-07
    • 1970-01-01
    相关资源
    最近更新 更多