2

我有一个程序需要在触发某个条件后完全停止处理 - 类似于这个问题:如何中止 Python 脚本的执行?

但是,就我而言,我想捕获 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 '
4

3 回答 3

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()可以完成这项工作。

于 2012-11-08T23:42:24.273 回答
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
于 2012-11-08T23:25:24.597 回答
0

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

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

raise子句中的一个bareexcept重新引发捕获的异常。

于 2012-11-09T00:02:29.117 回答