Python 3.3.2 不允许我使用 'raise SystemExit'

Python 3.3.2 doesn't allow me to use 'raise SystemExit'

name = input('name? ')
if len(name) == 0:
    print('error.\n')                            
    raise SystemExit

我在使用 python 3.3.2 时收到错误消息(遗憾的是这是学校版本),但它在其他版本上工作正常,例如2.7.10 和 3.5

这是错误

不确定这是否是您想要的,但如果您想退出,请使用:

import sys
name = raw_input('name? ')
if len(name) == 0:
    print('error.\n')
    sys.exit()         

这将通过引发 SystemExit 退出解释器。

你为什么不使用 sys.exit()

sys.exit([arg])

Exit from Python. This is implemented by raising the SystemExit exception, so cleanup actions specified by finally clauses of try statements are honored, and it is possible to intercept the exit attempt at an outer level.

您可能为 excepthook 设置了处理程序:

https://docs.python.org/3/library/sys.html#sys.excepthook

您应该可以通过

重置它

sys.excepthook = sys.__excepthook__

没关系,钩子对 BaseException 正常工作,但奇怪的是 SystemExit(它是 BaseException 的子类)就不行了。

您可能正在使用

执行您的程序

python3 -i whatever.py

这给了我你所看到的相同行为:

dario@feynman ~> python3 -i /tmp/a.py 
Traceback (most recent call last):
  File "/tmp/a.py", line 11, in <module>
     raise SystemExit()
SystemExit
>>> 

注意最后的>>>

只需从正在执行程序的任何内容中删除 -i 标志

或者,这是不好的做法,但您也可以使用 os._exit(1)

查看屏幕截图,我可以在底部看到 Python 提示:

这意味着脚本在交互式会话中 运行(我猜是 Windows 上的 IDLE)。我没有找到任何文档,但其他用户发现在交互式会话中提高 SystemExit 确实会打印回溯。

所以您应该检查并确保您没有在交互式会话中启动脚本。

旧答案:

看起来这是 Python 3.3.2 中的错误(或特殊性)。根据这个blog post:

If nothing catches the exception, then the python interpreter catches it at the end, does not print a stack trace, and then calls exit.

我尝试 raise SystemExit('asd') 并且程序刚刚打印 asd,所以看起来是真的。

升级 Python 或尝试 os._exit(1)