diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2016-10-21 14:09:17 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2016-10-21 14:09:17 (GMT) |
commit | 467ab194fc6189d9f7310c89937c51abeac56839 (patch) | |
tree | ac2397959d646b3656fbf4759f4e6cb9d82e4ae6 /Python/errors.c | |
parent | b0426cd8c4ecaa19cff05b4860da1c06531a77c1 (diff) | |
download | cpython-467ab194fc6189d9f7310c89937c51abeac56839.zip cpython-467ab194fc6189d9f7310c89937c51abeac56839.tar.gz cpython-467ab194fc6189d9f7310c89937c51abeac56839.tar.bz2 |
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 12bde28..918f4df 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 |