【问题标题】:Why finally block is executing after calling sys.exit(0) in except block?为什么在 except 块中调用 sys.exit(0) 后执行 finally 块?
【发布时间】:2011-12-04 07:06:44
【问题描述】:

我是 Python 新手。我只是想知道为什么finally 块在except 块中调用sys.exit(0) 之后执行?

代码:

import sys

def sumbyzero():
    try:
        10/0
        print "It will never print"
    except Exception:
        sys.exit(0)
        print "Printing after exit"
    finally:
        print "Finally will always print"

sumbyzero() 

顺便说一句,我只是想在 Java 中做同样的事情,当System.exit(0) 位于 catch 块中时,finally执行。

【问题讨论】:

    标签: python


    【解决方案1】:

    sys.exit() 所做的只是引发SystemExit 类型的异常。

    来自documentation

    退出 Python。这是通过提高SystemExit 来实现的 异常,因此由tryfinally 子句指定的清理操作 语句被兑现,并且可以拦截出口 尝试外层。

    如果你运行以下命令,你会自己看到:

    import sys
    try:
      sys.exit(0)
    except SystemExit as ex:
      print 'caught SystemExit:', ex
    

    作为替代方案,带有状态码的os._exit(n) 将停止进程绕过大部分清理工作,包括finally 块等。

    【讨论】:

      【解决方案2】:

      你应该使用os._exit(0)

      关于你的例子:

      finally 子句总是在离开 try 语句之前执行, 是否发生异常。

      这是来自 Python 文档的Error and Exceptions 部分。所以 - 您的 finally 块将始终在您展示的示例中执行,除非您将使用 os._exit(0)。但是你应该明智地使用它......

      【讨论】:

        猜你喜欢
        • 2020-05-17
        • 2016-02-04
        • 2019-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-20
        • 1970-01-01
        相关资源
        最近更新 更多