我尝试了以下脚本。
我的本意是,如果下面代码段中的命令“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 异常来工作。由于您有一个简单的 except,您的 SystemExit 异常将被捕获并抑制。
这就是为什么你永远不应该使用裸 except 子句的原因之一。至少,捕获 Exception:
try:
sys.exit()
except Exception:
pass
自 SystemExit doesn't inherit from Exception 1,不会被抓到。 作为更一般的规则,如果您不知道如何处理异常,则永远不应该捕获它。即使捕获 Exception 也几乎总是比您实际想要的更广泛。
最后,如果您发现自己处于被迫处理其他人的代码并且他们除了您无法更改之外几乎没有其他代码的情况,您可以使用 os._exit 终止当前进程而不引发 SystemExit。这通常是一个坏主意,但只有在最可怕的情况下才应采用2。
1SystemExit 和 KeyboardInterrupt 显式继承自 BaseException 以便它们赢了' t 当有人捕获 Exception 时被捕获。
2希望我已经说得足够清楚,最后一段是为了提供信息——我永远不会推荐使用它;-)
