Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e2d6690

Browse files
committed
Issue #21497: faulthandler functions now raise a better error if sys.stderr is
None: RuntimeError("sys.stderr is None") instead of AttributeError("'NoneType' object has no attribute 'fileno'").
1 parent e1e04ad commit e2d6690

2 files changed

Lines changed: 29 additions & 0 deletions

File tree

Lib/test/test_faulthandler.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -591,6 +591,31 @@ def test_register_threads(self):
591591
def test_register_chain(self):
592592
self.check_register(chain=True)
593593

594+
@contextmanager
595+
def check_stderr_none(self):
596+
stderr = sys.stderr
597+
try:
598+
sys.stderr = None
599+
with self.assertRaises(RuntimeError) as cm:
600+
yield
601+
self.assertEqual(str(cm.exception), "sys.stderr is None")
602+
finally:
603+
sys.stderr = stderr
604+
605+
def test_stderr_None(self):
606+
# Issue #21497: provide an helpful error if sys.stderr is None,
607+
# instead of just an attribute error: "None has no attribute fileno".
608+
with self.check_stderr_none():
609+
faulthandler.enable()
610+
with self.check_stderr_none():
611+
faulthandler.dump_traceback()
612+
if hasattr(faulthandler, 'dump_traceback_later'):
613+
with self.check_stderr_none():
614+
faulthandler.dump_traceback_later(1e-3)
615+
if hasattr(faulthandler, "register"):
616+
with self.check_stderr_none():
617+
faulthandler.register(signal.SIGUSR1)
618+
594619

595620
if __name__ == "__main__":
596621
unittest.main()

Modules/faulthandler.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,10 @@ faulthandler_get_fileno(PyObject *file, int *p_fd)
144144
PyErr_SetString(PyExc_RuntimeError, "unable to get sys.stderr");
145145
return NULL;
146146
}
147+
if (file == Py_None) {
148+
PyErr_SetString(PyExc_RuntimeError, "sys.stderr is None");
149+
return NULL;
150+
}
147151
}
148152

149153
result = _PyObject_CallMethodId(file, &PyId_fileno, "");

0 commit comments

Comments
 (0)