with catch_unraisable_exception() as cm:
d["foo"] = "bar"
self.assertIn(
- "PyDict_EVENT_ADDED watcher callback for <dict at",
- cm.unraisable.object
+ "Exception ignored in "
+ "PyDict_EVENT_ADDED watcher callback for <dict at ",
+ cm.unraisable.err_msg
)
+ self.assertIsNone(cm.unraisable.object)
self.assertEqual(str(cm.unraisable.exc_value), "boom!")
self.assert_events([])
self.watch(wid, C)
with catch_unraisable_exception() as cm:
C.foo = "bar"
- self.assertIs(cm.unraisable.object, C)
+ self.assertEqual(cm.unraisable.err_msg,
+ f"Exception ignored in type watcher callback #0 for {C!r}")
+ self.assertIs(cm.unraisable.object, None)
self.assertEqual(str(cm.unraisable.exc_value), "boom!")
self.assert_events([])
co = _testcapi.code_newempty("test_watchers", "dummy0", 0)
self.assertEqual(
- cm.unraisable.object,
+ cm.unraisable.err_msg,
+ f"Exception ignored in "
f"PY_CODE_EVENT_CREATE watcher callback for {co!r}"
)
+ self.assertIsNone(cm.unraisable.object)
self.assertEqual(str(cm.unraisable.exc_value), "boom!")
def test_dealloc_error(self):
pass
self.assertEqual(
- cm.unraisable.object,
- f"PyFunction_EVENT_CREATE watcher callback for {myfunc!r}"
+ cm.unraisable.err_msg,
+ f"Exception ignored in "
+ f"PyFunction_EVENT_CREATE watcher callback for {repr(myfunc)[1:-1]}"
)
+ self.assertIsNone(cm.unraisable.object)
def test_dealloc_watcher_raises_error(self):
class MyError(Exception):
rc, out, err = assert_python_failure('-c', code)
self.assertEqual(b'', out)
self.assertEqual(120, rc)
- self.assertRegex(err.decode('ascii', 'ignore'),
- 'Exception ignored in.*\nOSError: .*')
+ self.assertIn(b'Exception ignored on flushing sys.stdout:\n'
+ b'OSError: '.replace(b'\n', os.linesep.encode()),
+ err)
def test_closed_stdout(self):
# Issue #13444: if stdout has been explicitly closed, we should
#ifdef MS_WIN32
# include "pycore_modsupport.h" // _PyArg_NoKeywords()
#endif
-#include "pycore_pyerrors.h" // _PyErr_WriteUnraisableMsg()
#include <ffi.h>
DictRemoverObject *self = (DictRemoverObject *)myself;
if (self->key && self->dict) {
if (-1 == PyDict_DelItem(self->dict, self->key)) {
- _PyErr_WriteUnraisableMsg("on calling _ctypes.DictRemover", NULL);
+ PyErr_FormatUnraisable("Exception ignored on calling _ctypes.DictRemover");
}
Py_CLEAR(self->key);
Py_CLEAR(self->dict);
#include "Python.h"
#include "pycore_call.h" // _PyObject_CallNoArgs()
#include "pycore_ceval.h" // _PyEval_SetProfile()
-#include "pycore_pyerrors.h" // _PyErr_WriteUnraisableMsg()
#include "pycore_pystate.h" // _PyThreadState_GET()
#include "rotatingtree.h"
if (op->flags & POF_ENABLED) {
PyThreadState *tstate = _PyThreadState_GET();
if (_PyEval_SetProfile(tstate, NULL, NULL) < 0) {
- _PyErr_WriteUnraisableMsg("When destroying _lsprof profiler", NULL);
+ PyErr_FormatUnraisable("Exception ignored when destroying _lsprof profiler");
}
}
Py_INCREF(op);
(void) clear(op);
if (_PyErr_Occurred(tstate)) {
- _PyErr_WriteUnraisableMsg("in tp_clear of",
- (PyObject*)Py_TYPE(op));
+ PyErr_FormatUnraisable("Exception ignored in tp_clear of %s",
+ Py_TYPE(op)->tp_name);
}
Py_DECREF(op);
}
_PyErr_Clear(tstate);
}
else {
- _PyErr_WriteUnraisableMsg("in garbage collection", NULL);
+ PyErr_FormatUnraisable("Exception ignored in garbage collection");
}
}
"collected", collected,
"uncollectable", uncollectable);
if (info == NULL) {
- PyErr_WriteUnraisable(NULL);
+ PyErr_FormatUnraisable("Exception ignored on invoking gc callbacks");
return;
}
}
PyObject *phase_obj = PyUnicode_FromString(phase);
if (phase_obj == NULL) {
Py_XDECREF(info);
- PyErr_WriteUnraisable(NULL);
+ PyErr_FormatUnraisable("Exception ignored on invoking gc callbacks");
return;
}
#include "pycore_fileutils.h" // _Py_abspath()
#include "pycore_initconfig.h" // _PyStatus_EXCEPTION()
#include "pycore_pathconfig.h" // _PyPathConfig_ReadGlobal()
-#include "pycore_pyerrors.h" // _PyErr_WriteUnraisableMsg()
#include "pycore_pymem.h" // _PyMem_RawWcsdup()
#include "pycore_pystate.h" // _PyThreadState_GET()
) {
Py_DECREF(co);
Py_DECREF(dict);
- _PyErr_WriteUnraisableMsg("error evaluating initial values", NULL);
+ PyErr_FormatUnraisable("Exception ignored in preparing getpath");
return PyStatus_Error("error evaluating initial values");
}
if (!r) {
Py_DECREF(dict);
- _PyErr_WriteUnraisableMsg("error evaluating path", NULL);
+ PyErr_FormatUnraisable("Exception ignored in running getpath");
return PyStatus_Error("error evaluating path");
}
Py_DECREF(r);
if (_PyConfig_FromDict(config, configDict) < 0) {
- _PyErr_WriteUnraisableMsg("reading getpath results", NULL);
+ PyErr_FormatUnraisable("Exception ignored in reading getpath results");
Py_DECREF(dict);
return PyStatus_Error("error getting getpath results");
}
errno = (int) (intptr_t) data;
PyObject *exc = PyErr_GetRaisedException();
PyErr_SetFromErrno(PyExc_OSError);
- _PyErr_WriteUnraisableMsg("when trying to write to the signal wakeup fd",
- NULL);
+ PyErr_FormatUnraisable("Exception ignored when trying to write to the signal wakeup fd");
PyErr_SetRaisedException(exc);
errno = save_errno;
return 0;
recognizes the error codes used by both GetLastError() and
WSAGetLastError */
PyErr_SetExcFromWindowsErr(PyExc_OSError, send_errno);
- _PyErr_WriteUnraisableMsg("when trying to send to the signal wakeup fd", NULL);
+ PyErr_FormatUnraisable("Exception ignored when trying to send to the signal wakeup fd");
PyErr_SetRaisedException(exc);
return 0;
}
#include "pycore_tuple.h" // _PyTuple_ITEMS()
#include "clinic/codeobject.c.h"
-static PyObject* code_repr(PyCodeObject *co);
-
static const char *
code_event_name(PyCodeEvent event) {
switch (event) {
// callback must be non-null if the watcher bit is set
assert(cb != NULL);
if (cb(event, co) < 0) {
- // Don't risk resurrecting the object if an unraisablehook keeps
- // a reference; pass a string as context.
- PyObject *context = NULL;
- PyObject *repr = code_repr(co);
- if (repr) {
- context = PyUnicode_FromFormat(
- "%s watcher callback for %U",
- code_event_name(event), repr);
- Py_DECREF(repr);
- }
- if (context == NULL) {
- context = Py_NewRef(Py_None);
- }
- PyErr_WriteUnraisable(context);
- Py_DECREF(context);
+ PyErr_FormatUnraisable(
+ "Exception ignored in %s watcher callback for %R",
+ code_event_name(event), co);
}
}
i++;
// unraisablehook keep a reference to it, so we don't pass the
// dict as context, just an informative string message. Dict
// repr can call arbitrary code, so we invent a simpler version.
- PyObject *context = PyUnicode_FromFormat(
- "%s watcher callback for <dict at %p>",
+ PyErr_FormatUnraisable(
+ "Exception ignored in %s watcher callback for <dict at %p>",
dict_event_name(event), mp);
- if (context == NULL) {
- context = Py_NewRef(Py_None);
- }
- PyErr_WriteUnraisable(context);
- Py_DECREF(context);
}
}
watcher_bits >>= 1;
#include "pycore_pyerrors.h" // _PyErr_Occurred()
-static PyObject* func_repr(PyFunctionObject *op);
-
static const char *
func_event_name(PyFunction_WatchEvent event) {
switch (event) {
// callback must be non-null if the watcher bit is set
assert(cb != NULL);
if (cb(event, func, new_value) < 0) {
- // Don't risk resurrecting the func if an unraisablehook keeps a
- // reference; pass a string as context.
- PyObject *context = NULL;
- PyObject *repr = func_repr(func);
- if (repr != NULL) {
- context = PyUnicode_FromFormat(
- "%s watcher callback for %U",
- func_event_name(event), repr);
- Py_DECREF(repr);
- }
- if (context == NULL) {
- context = Py_NewRef(Py_None);
- }
- PyErr_WriteUnraisable(context);
- Py_DECREF(context);
+ PyErr_FormatUnraisable(
+ "Exception ignored in %s watcher callback for function %U at %p",
+ func_event_name(event), func->func_qualname, func);
}
}
i++;
PyErr_Clear();
}
if (PyDict_SetItem(d, key, Py_None) != 0) {
- PyErr_WriteUnraisable(NULL);
+ PyErr_FormatUnraisable("Exception ignored on clearing module dict");
}
}
}
PyErr_Clear();
}
if (PyDict_SetItem(d, key, Py_None) != 0) {
- PyErr_WriteUnraisable(NULL);
+ PyErr_FormatUnraisable("Exception ignored on clearing module dict");
}
}
}
{
int res = m->md_def->m_clear((PyObject*)m);
if (PyErr_Occurred()) {
- PySys_FormatStderr("Exception ignored in m_clear of module%s%V\n",
- m->md_name ? " " : "",
- m->md_name, "");
- PyErr_WriteUnraisable(NULL);
+ PyErr_FormatUnraisable("Exception ignored in m_clear of module%s%V",
+ m->md_name ? " " : "",
+ m->md_name, "");
}
if (res)
return res;
if (bits & 1) {
PyType_WatchCallback cb = interp->type_watchers[i];
if (cb && (cb(type) < 0)) {
- PyErr_WriteUnraisable((PyObject *)type);
+ PyErr_FormatUnraisable(
+ "Exception ignored in type watcher callback #%d for %R",
+ i, type);
}
}
i++;
// from a Python __buffer__ function.
mv = PyMemoryView_FromBuffer(buffer);
if (mv == NULL) {
- PyErr_WriteUnraisable(self);
+ PyErr_FormatUnraisable("Exception ignored in bf_releasebuffer of %s", Py_TYPE(self)->tp_name);
goto end;
}
// Set the memoryview to restricted mode, which forbids
PyObject *stack[2] = {self, mv};
PyObject *ret = vectorcall_method(&_Py_ID(__release_buffer__), stack, 2);
if (ret == NULL) {
- PyErr_WriteUnraisable(self);
+ PyErr_FormatUnraisable("Exception ignored in __release_buffer__ of %s", Py_TYPE(self)->tp_name);
}
else {
Py_DECREF(ret);
if (!is_buffer_wrapper) {
PyObject *res = PyObject_CallMethodNoArgs(mv, &_Py_ID(release));
if (res == NULL) {
- PyErr_WriteUnraisable(self);
+ PyErr_FormatUnraisable("Exception ignored in bf_releasebuffer of %s", Py_TYPE(self)->tp_name);
}
else {
Py_DECREF(res);
PyThreadState *tstate = _PyThreadState_GET();
if (_PyEval_SetProfile(tstate, func, arg) < 0) {
/* Log _PySys_Audit() error */
- _PyErr_WriteUnraisableMsg("in PyEval_SetProfile", NULL);
+ PyErr_FormatUnraisable("Exception ignored in PyEval_SetProfile");
}
}
while (ts) {
if (_PyEval_SetProfile(ts, func, arg) < 0) {
- _PyErr_WriteUnraisableMsg("in PyEval_SetProfileAllThreads", NULL);
+ PyErr_FormatUnraisable("Exception ignored in PyEval_SetProfileAllThreads");
}
HEAD_LOCK(runtime);
ts = PyThreadState_Next(ts);
PyThreadState *tstate = _PyThreadState_GET();
if (_PyEval_SetTrace(tstate, func, arg) < 0) {
/* Log _PySys_Audit() error */
- _PyErr_WriteUnraisableMsg("in PyEval_SetTrace", NULL);
+ PyErr_FormatUnraisable("Exception ignored in PyEval_SetTrace");
}
}
while (ts) {
if (_PyEval_SetTrace(ts, func, arg) < 0) {
- _PyErr_WriteUnraisableMsg("in PyEval_SetTraceAllThreads", NULL);
+ PyErr_FormatUnraisable("Exception ignored in PyEval_SetTraceAllThreads");
}
HEAD_LOCK(runtime);
ts = PyThreadState_Next(ts);
#include "pycore_flowgraph.h"
#include "pycore_intrinsics.h"
#include "pycore_long.h" // _PyLong_GetZero()
-#include "pycore_pyerrors.h" // _PyErr_WriteUnraisableMsg()
#include "pycore_pystate.h" // _Py_GetConfig()
#include "pycore_setobject.h" // _PySet_NextEntry()
#include "pycore_symtable.h" // PySTEntryObject, _PyFuture_FromAST()
assert(c->u);
/* we are deleting from a list so this really shouldn't fail */
if (PySequence_DelItem(c->c_stack, n) < 0) {
- _PyErr_WriteUnraisableMsg("on removing the last compiler "
- "stack item", NULL);
+ PyErr_FormatUnraisable("Exception ignored on removing "
+ "the last compiler stack item");
}
}
else {
if (PyList_SetSlice(MODULES_BY_INDEX(interp),
0, PyList_GET_SIZE(MODULES_BY_INDEX(interp)),
NULL)) {
- PyErr_WriteUnraisable(MODULES_BY_INDEX(interp));
+ PyErr_FormatUnraisable("Exception ignored on clearing interpreters module list");
}
}
int verbose = _PyInterpreterState_GetConfig(interp)->verbose;
if (_PySys_ClearAttrString(interp, "meta_path", verbose) < 0) {
- PyErr_WriteUnraisable(NULL);
+ PyErr_FormatUnraisable("Exception ignored on clearing sys.meta_path");
}
// XXX Pull in most of finalize_modules() in pylifecycle.c.
if (_PySys_ClearAttrString(interp, "modules", verbose) < 0) {
- PyErr_WriteUnraisable(NULL);
+ PyErr_FormatUnraisable("Exception ignored on clearing sys.modules");
}
if (IMPORT_LOCK(interp) != NULL) {
// XXX Uninstall importlib metapath importers here?
if (_PySys_ClearAttrString(interp, "path_importer_cache", verbose) < 0) {
- PyErr_WriteUnraisable(NULL);
+ PyErr_FormatUnraisable("Exception ignored on clearing sys.path_importer_cache");
}
if (_PySys_ClearAttrString(interp, "path_hooks", verbose) < 0) {
- PyErr_WriteUnraisable(NULL);
+ PyErr_FormatUnraisable("Exception ignored on clearing sys.path_hooks");
}
}
#include "pycore_ceval.h" // _PyPerf_Callbacks
#include "pycore_frame.h"
#include "pycore_interp.h"
-#include "pycore_pyerrors.h" // _PyErr_WriteUnraisableMsg()
#ifdef PY_HAVE_PERF_TRAMPOLINE
0); // offset (not used here)
if (!memory) {
PyErr_SetFromErrno(PyExc_OSError);
- _PyErr_WriteUnraisableMsg(
- "Failed to create new mmap for perf trampoline", NULL);
+ PyErr_FormatUnraisable("Failed to create new mmap for perf trampoline");
perf_status = PERF_STATUS_FAILED;
return -1;
}
if (res == -1) {
PyErr_SetFromErrno(PyExc_OSError);
munmap(memory, mem_size);
- _PyErr_WriteUnraisableMsg(
- "Failed to set mmap for perf trampoline to PROT_READ | PROT_EXEC",
- NULL);
+ PyErr_FormatUnraisable("Failed to set mmap for perf trampoline to "
+ "PROT_READ | PROT_EXEC");
return -1;
}
if (new_arena == NULL) {
PyErr_NoMemory();
munmap(memory, mem_size);
- _PyErr_WriteUnraisableMsg("Failed to allocate new code arena struct",
- NULL);
+ PyErr_FormatUnraisable("Failed to allocate new code arena struct for perf trampoline");
return -1;
}
PySys_WriteStderr("# clear builtins._\n");
}
if (PyDict_SetItemString(interp->builtins, "_", Py_None) < 0) {
- PyErr_WriteUnraisable(NULL);
+ PyErr_FormatUnraisable("Exception ignored on setting builtin variable _");
}
const char * const *p;
for (p = sys_deletes; *p != NULL; p++) {
if (_PySys_ClearAttrString(interp, *p, verbose) < 0) {
- PyErr_WriteUnraisable(NULL);
+ PyErr_FormatUnraisable("Exception ignored on clearing sys.%s", *p);
}
}
for (p = sys_files; *p != NULL; p+=2) {
}
PyObject *value;
if (PyDict_GetItemStringRef(interp->sysdict, orig_name, &value) < 0) {
- PyErr_WriteUnraisable(NULL);
+ PyErr_FormatUnraisable("Exception ignored on restoring sys.%s", name);
}
if (value == NULL) {
value = Py_NewRef(Py_None);
}
if (PyDict_SetItemString(interp->sysdict, name, value) < 0) {
- PyErr_WriteUnraisable(NULL);
+ PyErr_FormatUnraisable("Exception ignored on restoring sys.%s", name);
}
Py_DECREF(value);
}
{
PyObject *weaklist = PyList_New(0);
if (weaklist == NULL) {
- PyErr_WriteUnraisable(NULL);
+ PyErr_FormatUnraisable("Exception ignored on removing modules");
}
#define STORE_MODULE_WEAKREF(name, mod) \
if (wr) { \
PyObject *tup = PyTuple_Pack(2, name, wr); \
if (!tup || PyList_Append(weaklist, tup) < 0) { \
- PyErr_WriteUnraisable(NULL); \
+ PyErr_FormatUnraisable("Exception ignored on removing modules"); \
} \
Py_XDECREF(tup); \
Py_DECREF(wr); \
} \
else { \
- PyErr_WriteUnraisable(NULL); \
+ PyErr_FormatUnraisable("Exception ignored on removing modules"); \
} \
}
} \
STORE_MODULE_WEAKREF(name, mod); \
if (PyObject_SetItem(modules, name, Py_None) < 0) { \
- PyErr_WriteUnraisable(NULL); \
+ PyErr_FormatUnraisable("Exception ignored on removing modules"); \
} \
}
else {
PyObject *iterator = PyObject_GetIter(modules);
if (iterator == NULL) {
- PyErr_WriteUnraisable(NULL);
+ PyErr_FormatUnraisable("Exception ignored on removing modules");
}
else {
PyObject *key;
while ((key = PyIter_Next(iterator))) {
PyObject *value = PyObject_GetItem(modules, key);
if (value == NULL) {
- PyErr_WriteUnraisable(NULL);
+ PyErr_FormatUnraisable("Exception ignored on removing modules");
continue;
}
CLEAR_MODULE(key, value);
Py_DECREF(key);
}
if (PyErr_Occurred()) {
- PyErr_WriteUnraisable(NULL);
+ PyErr_FormatUnraisable("Exception ignored on removing modules");
}
Py_DECREF(iterator);
}
}
else {
if (PyObject_CallMethodNoArgs(modules, &_Py_ID(clear)) == NULL) {
- PyErr_WriteUnraisable(NULL);
+ PyErr_FormatUnraisable("Exception ignored on clearing sys.modules");
}
}
}
PyInterpreterState *interp = tstate->interp;
PyObject *dict = PyDict_Copy(interp->builtins);
if (dict == NULL) {
- PyErr_WriteUnraisable(NULL);
+ PyErr_FormatUnraisable("Exception ignored on restoring builtins");
}
PyDict_Clear(interp->builtins);
if (PyDict_Update(interp->builtins, interp->builtins_copy)) {
- PyErr_WriteUnraisable(NULL);
+ PyErr_FormatUnraisable("Exception ignored on restoring builtins");
}
Py_XDECREF(dict);
}
if (fout != NULL && fout != Py_None && !file_is_closed(fout)) {
if (_PyFile_Flush(fout) < 0) {
- PyErr_WriteUnraisable(fout);
+ PyErr_FormatUnraisable("Exception ignored on flushing sys.stdout");
status = -1;
}
}
PyObject *threading = PyImport_GetModule(&_Py_ID(threading));
if (threading == NULL) {
if (_PyErr_Occurred(tstate)) {
- PyErr_WriteUnraisable(NULL);
+ PyErr_FormatUnraisable("Exception ignored on threading shutdown");
}
/* else: threading not imported */
return;
}
result = PyObject_CallMethodNoArgs(threading, &_Py_ID(_shutdown));
if (result == NULL) {
- PyErr_WriteUnraisable(threading);
+ PyErr_FormatUnraisable("Exception ignored on threading shutdown");
}
else {
Py_DECREF(result);
PyErr_Clear();
goto done;
}
- _PyErr_WriteUnraisableMsg("in audit hook", NULL);
+ PyErr_FormatUnraisable("Exception ignored in audit hook");
}
if (hook) {
PyObject* args[3] = {typ, exc, tb};
_PyRuntime.signals.unhandled_keyboard_interrupt = unhandled_keyboard_interrupt;
#ifdef Py_DEBUG
if (PyErr_Occurred()) {
- _PyErr_WriteUnraisableMsg("in the internal traceback machinery", NULL);
+ PyErr_FormatUnraisable(
+ "Exception ignored in the internal traceback machinery");
}
#endif
PyErr_Clear();