我尝试了以下脚本。
我的初衷是如果命令" command_a"在以下代码段中成功执行,程序结束。否则,它会执行其他处理。
#!/usr/bin/python
import subprocess
try:
command = "command_a"
subprocess.check_call(command.split())
print "Woks fine!, and stopping"
sys.exit()
except:
pass
print "Continue additional processing"
call_some_additional_processing()
但是,我注意到sys.exit()
无效。即使subprocess.check_call成功,它也会调用call_some_additional_processing()。
您能告诉我原因是什么,以及解决此问题的最佳方法是什么?
答案 0 :(得分:7)
sys.exit
通过提升SystemExit
例外来工作。由于你有一个裸露的例外,你的SystemExit
例外被抓住并被压制。
这就是为什么你永远不应该有裸子条款的原因之一。至少,赶上Exception
:
try:
sys.exit()
except Exception:
pass
自SystemExit
doesn't inherit from Exception
1 以来,它不会被抓住。 作为更一般的规则,如果您不知道如何处理它,就不应该发现异常。即使抓住Exception
也几乎总是比你想要的更广泛。
最后,如果您发现自己处于被迫处理其他人的代码并且他们的情况下,除非您不能更改后,您可以使用os._exit
终止当前流程,而不会提升SystemExit
。这通常是一个坏主意,只应在最严峻的情况下使用 2 。
1 SystemExit
和KeyboardInterrupt
明确地从BaseException
继承,以便他们赢得被抓住有人抓住Exception
。
2 希望我已经明确表示,最后一段是为了提供信息 - 这不是我建议使用的东西; - )