[Python-checkins] gh-99947: Ensure unreported errors are chained for SystemError during import (GH-99946)

brettcannon webhook-mailer at python.org
Fri Dec 23 18:43:35 EST 2022


https://github.com/python/cpython/commit/474220e3a58d739acc5154eb3e000461d2222d62
commit: 474220e3a58d739acc5154eb3e000461d2222d62
branch: main
author: Sebastian Berg <sebastianb at nvidia.com>
committer: brettcannon <brett at python.org>
date: 2022-12-23T15:43:19-08:00
summary:

gh-99947: Ensure unreported errors are chained for SystemError during import (GH-99946)

files:
A Misc/NEWS.d/next/C API/2022-12-02-09-31-19.gh-issue-99947.Ski7OC.rst
M Lib/test/test_importlib/extension/test_loader.py
M Objects/moduleobject.c
M Python/importdl.c

diff --git a/Lib/test/test_importlib/extension/test_loader.py b/Lib/test/test_importlib/extension/test_loader.py
index d69192b56bac..3bf2bbdcdcc4 100644
--- a/Lib/test/test_importlib/extension/test_loader.py
+++ b/Lib/test/test_importlib/extension/test_loader.py
@@ -351,9 +351,14 @@ def test_bad_modules(self):
                 ]:
             with self.subTest(name_base):
                 name = self.name + '_' + name_base
-                with self.assertRaises(SystemError):
+                with self.assertRaises(SystemError) as cm:
                     self.load_module_by_name(name)
 
+                # If there is an unreported exception, it should be chained
+                # with the `SystemError`.
+                if "unreported_exception" in name_base:
+                    self.assertIsNotNone(cm.exception.__cause__)
+
     def test_nonascii(self):
         # Test that modules with non-ASCII names can be loaded.
         # punycode behaves slightly differently in some-ASCII and no-ASCII
diff --git a/Misc/NEWS.d/next/C API/2022-12-02-09-31-19.gh-issue-99947.Ski7OC.rst b/Misc/NEWS.d/next/C API/2022-12-02-09-31-19.gh-issue-99947.Ski7OC.rst
new file mode 100644
index 000000000000..fbed192d317b
--- /dev/null
+++ b/Misc/NEWS.d/next/C API/2022-12-02-09-31-19.gh-issue-99947.Ski7OC.rst	
@@ -0,0 +1 @@
+Raising SystemError on import will now have its cause be set to the original unexpected exception.
diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c
index 8e03f2446f6f..24190e320ee6 100644
--- a/Objects/moduleobject.c
+++ b/Objects/moduleobject.c
@@ -327,9 +327,10 @@ PyModule_FromDefAndSpec2(PyModuleDef* def, PyObject *spec, int module_api_versio
             goto error;
         } else {
             if (PyErr_Occurred()) {
-                PyErr_Format(PyExc_SystemError,
-                            "creation of module %s raised unreported exception",
-                            name);
+                _PyErr_FormatFromCause(
+                    PyExc_SystemError,
+                    "creation of module %s raised unreported exception",
+                    name);
                 goto error;
             }
         }
@@ -431,7 +432,7 @@ PyModule_ExecDef(PyObject *module, PyModuleDef *def)
                     return -1;
                 }
                 if (PyErr_Occurred()) {
-                    PyErr_Format(
+                    _PyErr_FormatFromCause(
                         PyExc_SystemError,
                         "execution of module %s raised unreported exception",
                         name);
diff --git a/Python/importdl.c b/Python/importdl.c
index 40227674ca47..91fa06f49c28 100644
--- a/Python/importdl.c
+++ b/Python/importdl.c
@@ -180,8 +180,7 @@ _PyImport_LoadDynamicModuleWithSpec(PyObject *spec, FILE *fp)
         }
         goto error;
     } else if (PyErr_Occurred()) {
-        PyErr_Clear();
-        PyErr_Format(
+        _PyErr_FormatFromCause(
             PyExc_SystemError,
             "initialization of %s raised unreported exception",
             name_buf);



More information about the Python-checkins mailing list