尝试后,sys.exit无法正常工作:
问题内容:
我尝试了以下脚本。
我的初衷是,如果成功执行以下代码段中的命令“ 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()。
您能告诉我原因是什么,什么是解决这个问题的最佳方法?
问题答案:
sys.exit
通过引发SystemExit
异常来工作。由于您只有一个裸露的例外,因此您的SystemExit
异常会被捕获和抑制。
这就是为什么您不应该使用裸子句的原因之一。至少要抓住Exception
:
try:
sys.exit()
except Exception:
pass
由于SystemExit
不继承自Exception
1,因此不会被捕获。 通常,如果您不知道如何处理异常,则永远不要捕获异常
。甚至捕获Exception
几乎总是比您想要的更广泛。
最后,如果您发现自己处在不得不处理别人代码的情况下,并且除了无法更改以外, 他们
几乎没有其他代码,可以os._exit
用来终止当前进程而无需提高SystemExit
。这通常是一个坏主意,但是只能在最恶劣的情况下使用2。
1SystemExit
并显式地KeyboardInterrupt
继承,BaseException
这样当有人捕捉时它们 不会
被捕捉Exception
。
2希望我已经足够清楚地说明了最后一段旨在提供信息-我不建议使用;-)