diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2016-10-21 17:09:17 +0300 |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2016-10-21 17:09:17 +0300 |
commit | 3888fec2a7d9d5688a9ada16652bdbc11449869f (patch) | |
tree | 8ead00f16c8e705b0034c489ccff09bc0b2ccb23 /Python/errors.c | |
parent | 0da06101a0e93a86d1fb10cb4edf2c6552d7e523 (diff) | |
download | cpython-3888fec2a7d9d5688a9ada16652bdbc11449869f.tar.gz |
Issue #28410: Added _PyErr_FormatFromCause() -- the helper for raising
new exception with setting current exception as __cause__.
_PyErr_FormatFromCause(exception, format, args...) is equivalent to Python
raise exception(format % args) from sys.exc_info()[1]
Diffstat (limited to 'Python/errors.c')
-rw-r--r-- | Python/errors.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/Python/errors.c b/Python/errors.c index 12bde287df..918f4dffab 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -401,6 +401,47 @@ _PyErr_ChainExceptions(PyObject *exc, PyObject *val, PyObject *tb) } } +static PyObject * +_PyErr_FormatVFromCause(PyObject *exception, const char *format, va_list vargs) +{ + PyObject *exc, *val, *val2, *tb; + + assert(PyErr_Occurred()); + PyErr_Fetch(&exc, &val, &tb); + PyErr_NormalizeException(&exc, &val, &tb); + if (tb != NULL) { + PyException_SetTraceback(val, tb); + Py_DECREF(tb); + } + Py_DECREF(exc); + assert(!PyErr_Occurred()); + + PyErr_FormatV(exception, format, vargs); + + PyErr_Fetch(&exc, &val2, &tb); + PyErr_NormalizeException(&exc, &val2, &tb); + Py_INCREF(val); + PyException_SetCause(val2, val); + PyException_SetContext(val2, val); + PyErr_Restore(exc, val2, tb); + + return NULL; +} + +PyObject * +_PyErr_FormatFromCause(PyObject *exception, const char *format, ...) +{ + va_list vargs; +#ifdef HAVE_STDARG_PROTOTYPES + va_start(vargs, format); +#else + va_start(vargs); +#endif + _PyErr_FormatVFromCause(exception, format, vargs); + va_end(vargs); + return NULL; +} + /* Convenience functions to set a type error exception and return 0 */ int |