以下代码使python崩溃:
import sys
sys.stdout = sys.stderr = None
print "goodbye world!"
我知道没有真正的理由编写这样的代码,但我想知道它为什么会崩溃。
我的第一个猜测是print
命令失败是因为stdout
被覆盖,然后,在尝试引发异常时,又引发了另一个异常,因为stderr
也被覆盖了。
因此,它在尝试引发异常时会发生堆栈溢出。
谁能解释这里背景中真正发生的事情?
这是堆栈溢出吗?
以下代码使python崩溃:
import sys
sys.stdout = sys.stderr = None
print "goodbye world!"
我知道没有真正的理由编写这样的代码,但我想知道它为什么会崩溃。
我的第一个猜测是print
命令失败是因为stdout
被覆盖,然后,在尝试引发异常时,又引发了另一个异常,因为stderr
也被覆盖了。
因此,它在尝试引发异常时会发生堆栈溢出。
谁能解释这里背景中真正发生的事情?
这是堆栈溢出吗?
该print
语句引发异常,因为sys.stdout
设置为None
:
>>> import sys
>>> sys.stdout = None
>>> print "goodbye world!"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'write'
仅此异常就足以让 Python 退出,因为您没有在任何地方处理异常。
但是,您也设置为sys.stderr
,因此无处可写入此回溯。这种情况在函数中是特殊情况:None
PyErr_Display
PyObject *f = PySys_GetObject("stderr");
Py_INCREF(value);
if (f == NULL || f == Py_None)
fprintf(stderr, "lost sys.stderr\n");
在这里,Python 向原件stderr
(由操作系统传递给 Python,而不是sys.stderr
)写了一条消息,让您知道它无法告诉您真正出了什么问题。
这不是崩溃,这是 Python 优雅地处理这种情况。