【问题标题】:python sys.exit not working in try [duplicate]python sys.exit在尝试中不起作用[重复]
【发布时间】:2014-11-12 09:30:15
【问题描述】:
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(),有什么建议...!!!

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

我已经尝试了所有我知道的触发它的方法,但我失败了。 它进入'except'块。

提前谢谢..

【问题讨论】:

  • 我将其作为副本关闭,因为另一篇文章解释了 a) 出了什么问题和 b) 如何避免这种情况。毯子except: 子句不是一个好主意,最好使用except Exception: 以避免捕获SystemExit
  • 如果您不想触发异常,请使用 os._exit(0)。
  • @Back2Basics:不要打电话给os._exit();这只是确保在处理器退出时不会清理任何内容。

标签: python python-2.7 redhat exit


【解决方案1】:

sys.exit() 引发异常,即SystemExit。这就是你进入except-block 的原因。

看这个例子:

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

【讨论】:

  • 在 try 块中有没有办法做到这一点。
  • 没有理由,因为您试图实现的是在try 中引发异常并在下一刻“捕获”它。这绝对是一无所知;-)
  • 使用except Exception,因为SystemExit直接继承自BaseException。见exception hierarchy
  • 谢谢哥们..!!如果您对此有任何想法,请及时更新我。
  • @onlyvinish 他已经给了你一个想法!你还缺少什么?
【解决方案2】:

基于python wiki:

由于exit()最终“只”引发异常,所以只有在主线程调用时才会退出进程,异常不会被拦截。

还有:

当程序被信号杀死、检测到 Python 致命内部错误或调用 os._exit() 时,不会调用 exit 函数。

因此,如果您在引发SystemExit 异常后在try 块中使用sys.exit(),则python 拒绝完成exits 的功能并执行exception 块。

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

方法一(不推荐)

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

方法二(推荐):

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)

【讨论】:

  • 不要自己打电话给os._exit()只是不要接听SystemExit。调用 os._exit() 意味着什么也没有被清理。
猜你喜欢
  • 2021-12-06
  • 1970-01-01
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-12
  • 2017-01-30
  • 1970-01-01
相关资源
最近更新 更多