停止处理程序并停止追溯?

时间:2012-11-08 20:30:32

标签: python traceback

我有一个程序需要在触发某个条件后完全停止处理 - 类似于这个问题: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 '

2 个答案:

答案 0 :(得分:3)

据我所知,我并不完全确定你在问什么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()这样的工作。

答案 1 :(得分:1)

您可以使用系统退出异常不是从Exception派生的事实:

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