Skip to content

Commit c1a6832

Browse files
bpo-33330: Write exceptions occurred in PyImport_Cleanup() to stderr. (GH-6606)
They where silenced before.
1 parent 55edd0c commit c1a6832

File tree

2 files changed

+26
-20
lines changed

2 files changed

+26
-20
lines changed

Objects/moduleobject.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -603,8 +603,9 @@ _PyModule_ClearDict(PyObject *d)
603603
else
604604
PyErr_Clear();
605605
}
606-
if (PyDict_SetItem(d, key, Py_None) != 0)
607-
PyErr_Clear();
606+
if (PyDict_SetItem(d, key, Py_None) != 0) {
607+
PyErr_WriteUnraisable(NULL);
608+
}
608609
}
609610
}
610611
}
@@ -623,8 +624,9 @@ _PyModule_ClearDict(PyObject *d)
623624
else
624625
PyErr_Clear();
625626
}
626-
if (PyDict_SetItem(d, key, Py_None) != 0)
627-
PyErr_Clear();
627+
if (PyDict_SetItem(d, key, Py_None) != 0) {
628+
PyErr_WriteUnraisable(NULL);
629+
}
628630
}
629631
}
630632
}

Python/import.c

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -417,14 +417,14 @@ PyImport_Cleanup(void)
417417
if (Py_VerboseFlag)
418418
PySys_WriteStderr("# clear builtins._\n");
419419
if (PyDict_SetItemString(interp->builtins, "_", Py_None) < 0) {
420-
PyErr_Clear();
420+
PyErr_WriteUnraisable(NULL);
421421
}
422422

423423
for (p = sys_deletes; *p != NULL; p++) {
424424
if (Py_VerboseFlag)
425425
PySys_WriteStderr("# clear sys.%s\n", *p);
426426
if (PyDict_SetItemString(interp->sysdict, *p, Py_None) < 0) {
427-
PyErr_Clear();
427+
PyErr_WriteUnraisable(NULL);
428428
}
429429
}
430430
for (p = sys_files; *p != NULL; p+=2) {
@@ -434,7 +434,7 @@ PyImport_Cleanup(void)
434434
if (value == NULL)
435435
value = Py_None;
436436
if (PyDict_SetItemString(interp->sysdict, *p, value) < 0) {
437-
PyErr_Clear();
437+
PyErr_WriteUnraisable(NULL);
438438
}
439439
}
440440

@@ -443,22 +443,23 @@ PyImport_Cleanup(void)
443443
for diagnosis messages (in verbose mode), while the weakref helps
444444
detect those modules which have been held alive. */
445445
weaklist = PyList_New(0);
446-
if (weaklist == NULL)
447-
PyErr_Clear();
446+
if (weaklist == NULL) {
447+
PyErr_WriteUnraisable(NULL);
448+
}
448449

449450
#define STORE_MODULE_WEAKREF(name, mod) \
450451
if (weaklist != NULL) { \
451452
PyObject *wr = PyWeakref_NewRef(mod, NULL); \
452453
if (wr) { \
453454
PyObject *tup = PyTuple_Pack(2, name, wr); \
454455
if (!tup || PyList_Append(weaklist, tup) < 0) { \
455-
PyErr_Clear(); \
456+
PyErr_WriteUnraisable(NULL); \
456457
} \
457458
Py_XDECREF(tup); \
458459
Py_DECREF(wr); \
459460
} \
460461
else { \
461-
PyErr_Clear(); \
462+
PyErr_WriteUnraisable(NULL); \
462463
} \
463464
}
464465
#define CLEAR_MODULE(name, mod) \
@@ -467,7 +468,7 @@ PyImport_Cleanup(void)
467468
PySys_FormatStderr("# cleanup[2] removing %U\n", name); \
468469
STORE_MODULE_WEAKREF(name, mod); \
469470
if (PyObject_SetItem(modules, name, Py_None) < 0) { \
470-
PyErr_Clear(); \
471+
PyErr_WriteUnraisable(NULL); \
471472
} \
472473
}
473474

@@ -482,21 +483,21 @@ PyImport_Cleanup(void)
482483
else {
483484
PyObject *iterator = PyObject_GetIter(modules);
484485
if (iterator == NULL) {
485-
PyErr_Clear();
486+
PyErr_WriteUnraisable(NULL);
486487
}
487488
else {
488489
while ((key = PyIter_Next(iterator))) {
489490
value = PyObject_GetItem(modules, key);
490491
if (value == NULL) {
491-
PyErr_Clear();
492+
PyErr_WriteUnraisable(NULL);
492493
continue;
493494
}
494495
CLEAR_MODULE(key, value);
495496
Py_DECREF(value);
496497
Py_DECREF(key);
497498
}
498499
if (PyErr_Occurred()) {
499-
PyErr_Clear();
500+
PyErr_WriteUnraisable(NULL);
500501
}
501502
Py_DECREF(iterator);
502503
}
@@ -508,17 +509,20 @@ PyImport_Cleanup(void)
508509
}
509510
else {
510511
_Py_IDENTIFIER(clear);
511-
if (_PyObject_CallMethodId(modules, &PyId_clear, "") == NULL)
512-
PyErr_Clear();
512+
if (_PyObject_CallMethodId(modules, &PyId_clear, "") == NULL) {
513+
PyErr_WriteUnraisable(NULL);
514+
}
513515
}
514516
/* Restore the original builtins dict, to ensure that any
515517
user data gets cleared. */
516518
dict = PyDict_Copy(interp->builtins);
517-
if (dict == NULL)
518-
PyErr_Clear();
519+
if (dict == NULL) {
520+
PyErr_WriteUnraisable(NULL);
521+
}
519522
PyDict_Clear(interp->builtins);
520-
if (PyDict_Update(interp->builtins, interp->builtins_copy))
523+
if (PyDict_Update(interp->builtins, interp->builtins_copy)) {
521524
PyErr_Clear();
525+
}
522526
Py_XDECREF(dict);
523527
/* Clear module dict copies stored in the interpreter state */
524528
_PyState_ClearModules();

0 commit comments

Comments
 (0)