【问题标题】:halt processing of program AND stop traceback?停止程序处理并停止回溯?
【发布时间】:2012-11-08 20:30:32
【问题描述】:

我有一个程序需要在触发某个条件后完全停止处理 - 类似于这个问题:How do I abort the execution of a Python script?

但是,就我而言,我想捕获 sys.exit() 生成的回溯,并且最重要的是停止处理超出该点的任何代码块。有人可以帮忙吗?

try:
    a = 'i' / 1
    print 'Does this work yet?'
except TypeError:
    print "I should stop processing now"
    try:
        sys.exit()
    except:
        pass
print 'I did not stop processing '

【问题讨论】:

  • 我也尝试过 try-except 代码块、嵌套 try-except 代码块和引发 SystemExit。

标签: python traceback


【解决方案1】:

我不完全确定您在问什么,据我所知sys.exit() 不会生成回溯。如果您尝试按原样执行代码,sys.exit() 会引发未处理的 NameError 异常,因为您尚未导入“sys”模块。根据文档,使用 try/except 块围绕对 sys.exit() 的调用将捕获 NameError 异常,但它也会捕获 sys.exit() 引发的正常异常:

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

这是一个一旦遇到错误就会停止处理的版本。

import sys

try:
    a = 'i' / 1
    print 'Does this work yet?'
except TypeError:
    print "I should stop processing now"
    sys.exit()
print 'I did not stop processing '

如果此代码在您的主模块中,我建议将您的入口点代码包装成这样:

import sys

def main():
    try:
        a = 'i' / 1
        print 'Does this work yet?'
    except TypeError:
        print "I should stop processing now"
        return 1
    print 'I did not stop processing '
    return 0

if __name__ == "__main__": sys.exit(main())

这样,您只需要一次调用 sys.exit(),它会返回一个错误代码,指示是否存在问题。如果您的代码不在顶级入口点,我建议您将异常向上抛出,直到它到达 main() 方法,然后它可以返回错误代码值。您可以将真正的异常包装在您必须定义的新“StopMyApplicationException”中。

哦,如果你想打印回溯,你可以使用traceback 模块,traceback.print_exc() 之类的就可以了。

【讨论】:

    【解决方案2】:

    您可以利用系统退出异常并非源自Exception这一事实:

    try:
        a = 'i' / 1
        print 'Does this work yet?'
    except TypeError:
        print "I should stop processing now"
        try:
            raise SystemExit
        except Exception:
            pass
    

    【讨论】:

      【解决方案3】:

      您可以访问sys.exit 生成的异常,但它不会有回溯。

      try:
          sys.exit()
      except SystemExit as e:
          # do what you want with e, e.g.
          traceback.print_exc(e)
          raise
      

      except 子句中的 raise 会重新引发捕获的异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-26
        • 2021-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多