尝试后,sys.exit无法按预期工作:

cha*_*com 1 python subprocess exception-handling

我尝试了以下脚本.

我的初衷是如果成功执行以下代码段中的命令"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()
Run Code Online (Sandbox Code Playgroud)

但是,我注意到这sys.exit()没有按预期工作.即使subprocess.check_call成功,它也会调用call_some_additional_processing().

你能告诉我原因是什么,解决这个问题的最佳方法是什么?

mgi*_*son 8

sys.exit通过提出SystemExit例外来工作.由于你有一个裸的,你的SystemExit异常被捕获和抑制.

这就是为什么你永远不应该有裸子条款的原因之一.至少,赶上Exception:

try:
    sys.exit()
except Exception:
    pass
Run Code Online (Sandbox Code Playgroud)

由于SystemExit不从Exception1 继承,因此不会被捕获. 作为一般规则,如果您不知道如何处理异常,则不应该捕获异常.即便捕捉Exception也几乎总是比你想要的更广泛.


最后,如果你发现自己在你不得不对付别人的代码的情况和他们有一个裸露的不同之处在于,你无法改变,你可以使用os._exit终止当前过程不提高SystemExit.这通常是一个坏主意,只应在最严峻的情况下使用2.

1,SystemExit并明确地KeyboardInterrupt继承,BaseException以便当有人捕捉它们时不会被捕获Exception.
2希望我已经明确表示,最后一段是为了提供信息 - 这不是我推荐使用的东西;-)