Is there a way to prevent a SystemExit exception raised from sys.exit() from being caught?
文档说调用sys.exit()会引发一个SystemExit异常,这种异常可以在外部级别捕获。我有一种情况,在这种情况下,我希望从测试用例内部明确地、毫无疑问地退出,但是UnitTest模块捕获SystemExit并阻止退出。这通常很好,但我尝试处理的具体情况是,我们的测试框架检测到它配置为指向非测试数据库。在这种情况下,我希望退出并阻止运行任何进一步的测试。当然,由于UnitTest捕获了系统出口并继续沿着它的方式愉快地运行,所以它阻碍了我。
到目前为止,我唯一想到的选择是使用ctypes或者类似于直接调用exit(3)的东西,但是对于一些应该非常简单的东西来说,这似乎是一个非常简单的方法。
您可以调用
1 2 | import os os._exit(1) |
这将绕过所有的python关闭逻辑,例如
如耶路伯所说,以东十一〔二〕是你的回答。但是,考虑到它绕过了所有清理过程,包括
如果你的问题是
你甚至可以选择哪个出口是"紧急"出口。下面的代码就是这种方法的一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import sys, os EMERGENCY = 255 # can be any number actually try: # wrap your whole code here ... # ... some code if x: sys.exit() # ... some more code if y: sys.exit(EMERGENCY) # use only for emergency exits # ... except SystemExit as e: if e.code != EMERGENCY: raise # normal exit, let unittest catch it else: os._exit(EMERGENCY) # try to stop *that*, sucker! |