【问题标题】:Why does exit(0) in TRY loop result in an exception being thrown? [duplicate]为什么 TRY 循环中的 exit(0) 会导致抛出异常? [复制]
【发布时间】:2016-08-05 19:21:26
【问题描述】:

考虑以下示例:

try:
     print "Try this."
     exit(0)
except:
     print "Failed."
     exit(1)

当这个简单的例子被执行时,以下内容被打印到标准输出:

Try this.
Failed.

如果有一个明显的答案或者已经问过这个问题,请原谅我,但为什么exit(0)(它应该给我一个干净的退出)抛出一个异常?

我尝试在实际用例脚本中使用try: except: 循环,发现即使try 条件对exit(0). 表示,脚本也会退出(1)

所以我猜exit(0) 正在抛出某种(隐藏的?)异常,但为什么呢?它不显示回溯(例如当使用 CTRL + C 生成 KeyboardInterrupt 异常时),并导致意外行为,例如在我的情况下,当我期望返回 0 并最终返回 1。

异常(任何异常)是唯一退出python脚本的方式吗?

【问题讨论】:

  • 如果您只是 Google python exit,就会显示很多关于此的信息。
  • @user2357112 抱歉,我猜我今天失明了。标记为重复。谢谢。

标签: python-2.7 exception


【解决方案1】:

这里引发的异常是SystemExit Exception。因此,如果您尝试:

try:
     print "Try this."
     exit(0)
except SystemExit:
     pass
except:
     print "Failed."
     exit(1)

输出是:

Try this.

为了防止这种情况,你可以调用os._exit()直接退出,不抛出异常:

import os
try:
     print "Try this."
     os._exit(0)
except SystemExit:
     pass
except:
     print "Failed."
     os._exit(1)

引用user2357112:

os._exit 跳过 finally 块、上下文管理器 __exit__s、退出处理程序和其他重要的清理,所以除了一些非常具体的情况(我相信其中大多数涉及 fork)之外,使用它不是一个好主意它。

【讨论】:

  • except not SystemExit 并没有按照你的想法去做。
  • 好的,请帮帮我。我的意思是不要测试那个异常......
  • 无法指定“除此之外的所有例外”。最接近的方法是使用except BaseException as e 捕获所有异常,然后使用if isinstance(e, SystemExit): raise 取消捕获您不想要的异常(raise 没有参数)。
  • 我的编辑版本怎么样?
  • os._exit 跳过 finally 块、上下文管理器__exit__s、退出处理程序和其他重要的清理,所以除了一些高度具体的情况(我相信其中大多数都涉及fork),使用它不是一个好主意。此外,您的第一个代码 sn-p 仍然尝试执行 except not SystemExit
猜你喜欢
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
相关资源
最近更新 更多