mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
bpo-29587: _PyErr_ChainExceptions() checks exception (GH-19902)
_PyErr_ChainExceptions() now ensures that the first parameter is an exception type, as done by _PyErr_SetObject(). * The following function now check PyExceptionInstance_Check() in an assertion using a new _PyBaseExceptionObject_cast() helper function: * PyException_GetTraceback(), PyException_SetTraceback() * PyException_GetCause(), PyException_SetCause() * PyException_GetContext(), PyException_SetContext() * PyExceptionClass_Name() now checks PyExceptionClass_Check() with an assertion. * Remove XXX comment and add gi_exc_state variable to _gen_throw(). * Remove comment from test_generators
This commit is contained in:
parent
4e30ed3af0
commit
b0be6b3b94
4 changed files with 45 additions and 24 deletions
|
@ -107,7 +107,8 @@ _PyErr_SetObject(PyThreadState *tstate, PyObject *exception, PyObject *value)
|
|||
if (exception != NULL &&
|
||||
!PyExceptionClass_Check(exception)) {
|
||||
_PyErr_Format(tstate, PyExc_SystemError,
|
||||
"exception %R not a BaseException subclass",
|
||||
"_PyErr_SetObject: "
|
||||
"exception %R is not a BaseException subclass",
|
||||
exception);
|
||||
return;
|
||||
}
|
||||
|
@ -484,6 +485,15 @@ _PyErr_ChainExceptions(PyObject *exc, PyObject *val, PyObject *tb)
|
|||
return;
|
||||
|
||||
PyThreadState *tstate = _PyThreadState_GET();
|
||||
|
||||
if (!PyExceptionClass_Check(exc)) {
|
||||
_PyErr_Format(tstate, PyExc_SystemError,
|
||||
"_PyErr_ChainExceptions: "
|
||||
"exception %R is not a BaseException subclass",
|
||||
exc);
|
||||
return;
|
||||
}
|
||||
|
||||
if (_PyErr_Occurred(tstate)) {
|
||||
PyObject *exc2, *val2, *tb2;
|
||||
_PyErr_Fetch(tstate, &exc2, &val2, &tb2);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue