Index: Python/errors.c =================================================================== --- Python/errors.c (révision 65930) +++ Python/errors.c (copie de travail) @@ -66,6 +66,8 @@ if (tstate->exc_value != NULL && tstate->exc_value != Py_None) { /* Implicit exception chaining */ if (value == NULL || !PyExceptionInstance_Check(value)) { + PyObject *exc_type, *exc_value, *exc_traceback; + /* We must normalize the value right now */ PyObject *args, *fixed_value; if (value == NULL || value == Py_None) @@ -76,8 +78,30 @@ } else args = PyTuple_Pack(1, value); + + Py_XINCREF(tstate->exc_type); + Py_XINCREF(tstate->exc_value); + Py_XINCREF(tstate->exc_traceback); + exc_type = tstate->exc_type; + exc_value = tstate->exc_value; + exc_traceback = tstate->exc_traceback; + fixed_value = args ? PyEval_CallObject(exception, args) : NULL; + + if (tstate->exc_value != exc_value) { + Py_XDECREF(tstate->exc_type); + tstate->exc_type = exc_type ; + Py_XDECREF(tstate->exc_value); + tstate->exc_value = exc_value ; + Py_XDECREF(tstate->exc_traceback); + tstate->exc_traceback = exc_traceback ; + } else { + Py_XDECREF(exc_value); + Py_XDECREF(exc_type); + Py_XDECREF(exc_traceback); + } + Py_XDECREF(args); Py_XDECREF(value); if (fixed_value == NULL)