H
Hrvoje =?UTF-8?Q?Nik=C5=A1i=C4=87?=
I'm wondering what happens with the exception info during object cleanup
immediately after an exception is thrown. Consider this code:
PyObject *args = PyBuild_Value("(O(O){})", name, parent);
if (!args)
return NULL;
PyObject *val = some_python_func(x, args, NULL);
Py_DECREF(args);
if (!val)
return NULL;
The idea is to propagate the exception possibly raised by
some_python_func and at the same time avoid leaking memory. But
Py_DECREF can cause arbitrary Python code to get executed, including the
code that eventually ends up calling PyErr_Clear when it wants to ignore
some unrelated exception. This could cause exception information to be
forgotten.
Is there a way around this, or is there a reason why this is not a
problem in practice?
immediately after an exception is thrown. Consider this code:
PyObject *args = PyBuild_Value("(O(O){})", name, parent);
if (!args)
return NULL;
PyObject *val = some_python_func(x, args, NULL);
Py_DECREF(args);
if (!val)
return NULL;
The idea is to propagate the exception possibly raised by
some_python_func and at the same time avoid leaking memory. But
Py_DECREF can cause arbitrary Python code to get executed, including the
code that eventually ends up calling PyErr_Clear when it wants to ignore
some unrelated exception. This could cause exception information to be
forgotten.
Is there a way around this, or is there a reason why this is not a
problem in practice?