我尝试了以下脚本.
我的初衷是,如果成功执行以下代码段中的命令“ 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
doesn’t inherit from Exception
1开始,不会被捕获.作为更一般的规则,如果您不知道如何处理异常,则永远不要捕获异常.甚至捕获Exception几乎总是比您想要的更广泛.
最后,如果您发现自己处在不得不处理别人的代码的情况下,并且除了无法更改以外,他们几乎没有代码,则可以使用os._exit终止当前进程,而无需提高SystemExit.这通常是一个坏主意,但是只能在最恶劣的情况下使用2.
1SystemExit和KeyboardInterrupt显式继承自BaseException,以便在有人捕获Exception时不会被捕获.
2希望我已经很清楚地表明最后一段旨在提供信息-我不建议使用;-)