尝试后,sys.exit没有按预期工作:

时间:2017-03-03 03:21:26

标签: python exception-handling subprocess

我尝试了以下脚本。

我的初衷是如果命令" 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()。

您能告诉我原因是什么,以及解决此问题的最佳方法是什么?

1 个答案:

答案 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 SystemExitKeyboardInterrupt明确地从BaseException继承,以便他们赢得被抓住有人抓住Exception
2 希望我已经明确表示,最后一段是为了提供信息 - 这不是我建议使用的东西; - )