尝试后,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不继承自Exception1,因此不会被捕获。 通常,如果您不知道如何处理异常,则永远不要捕获异常
。甚至捕获Exception几乎总是比您想要的更广泛。


最后,如果您发现自己处在不得不处理别人代码的情况下,并且除了无法更改以外, 他们
几乎没有其他代码,可以os._exit用来终止当前进程而无需提高SystemExit。这通常是一个坏主意,但是只能在最恶劣的情况下使用2。

1SystemExit并显式地KeyboardInterrupt继承,BaseException这样当有人捕捉时它们 不会
被捕捉Exception
2希望我已经足够清楚地说明了最后一段旨在提供信息-我不建议使用;-)