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