python sys.exit 在 try [duplicate] 中不起作用

python sys.exit not working in try [duplicate]

提问人:onlyvinish 提问时间:9/18/2014 最后编辑:Martijn Pietersonlyvinish 更新时间:4/18/2018 访问量:72071

问:

Python 2.7.5 (default, Feb 26 2014, 13:43:17)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> try:
...  sys.exit()
... except:
...  print "in except"
...
in except
>>> try:
...  sys.exit(0)
... except:
...  print "in except"
...
in except
>>> try:
...  sys.exit(1)
... except:
...  print "in except"
...
in except

为什么我无法在try中触发sys.exit(),任何建议...!!

此处发布的代码包含所有版本详细信息。

我已经尝试了所有我知道的可能方法来触发它,但我失败了。 它进入“除外”块。

提前致谢..

python-2.7 redhat 退出

评论

4赞 Martijn Pieters 9/18/2014
我将其作为重复项关闭,因为另一篇文章解释了 a) 出了什么问题和 b) 如何避免这种情况。一揽子条款不是一个好主意,充其量是为了避免抓住.except:except Exception:SystemExit
0赞 Back2Basics 9/18/2014
如果不想触发异常,请使用 os._exit(0)。
4赞 Martijn Pieters 9/18/2014
@Back2Basics:不要打电话;这只能确保在处理器退出时不会清理任何内容。os._exit()

答:

40赞 tamasgal 9/18/2014 #1

sys.exit()引发异常,即 。这就是你降落在-block中的原因。SystemExitexcept

请参阅此示例:

import sys

try:
    sys.exit()
except:
    print(sys.exc_info()[0])

这为您提供了:

<type 'exceptions.SystemExit'>

虽然我无法想象一个人有任何实际的理由这样做,但你可以使用这个结构:

import sys

try:
    sys.exit() # this always raises SystemExit
except SystemExit:
    print("sys.exit() worked as expected")
except:
    print("Something went horribly wrong") # some other exception got raised

评论

0赞 onlyvinish 9/18/2014
有什么方法可以在try块中做到这一点。
0赞 tamasgal 9/18/2014
没有理由,因为你试图实现的是引发一个异常并在下一刻“抓住”它。这绝对是无知的;-)try
6赞 Vincent 9/18/2014
使用 ,因为直接继承自 。查看异常层次结构except ExceptionSystemExitBaseException
0赞 onlyvinish 9/18/2014
谢谢伙计..!!如果您对此有任何想法,请更新我。
2赞 glglgl 9/18/2014
@onlyvinish 他已经给了你一个主意!你还错过了什么?
12赞 Mazdak 9/18/2014 #2

基于 Python Wiki :

由于 exit() 最终“仅”引发异常,因此它只会在从主线程调用时退出进程,并且不会拦截异常。

和:

当程序被信号终止时,当检测到 Python 致命内部错误或调用时,不会调用该函数。exitos._exit()

因此,如果你在一个块内使用 python 在引发异常后拒绝完成 的功能并执行该块。sys.exit()trySystemExitexitsexception

现在,从编程的角度来看,你基本上不需要把你知道肯定会引起异常的东西放在块中。相反,您可以手动引发 SystemExit 异常,或者如果您不想失去相应的功能,例如将可选参数传递给其构造函数,您可以调用 ,甚至块。trysys.exit()sys.exit()finallyelseexcept

方法 1(不推荐)

try:
    # do stuff
except some_particular_exception:
    # handle this exception and then if you want 
    # do raise SystemExit
else:
    # do stuff and/or do raise SystemExit
finally:
    # do stuff and/or do raise SystemExit

方法 2(推荐):

try:
    # do stuff
except some_particular_exception:
    # handle this exception and then if you want 
    # do sys.exit(stat_code)
else:
    # do stuff and/or do sys.exit(stat_code)
finally:
    # do stuff and/or do sys.exit(stat_code)

评论

4赞 Martijn Pieters 9/18/2014
不要给自己打电话,只是不要抓住 SystemExit。打电话意味着什么都没有被清理。os._exit()os._exit()