diff options
Diffstat (limited to 'gdb/python/py-utils.c')
-rw-r--r-- | gdb/python/py-utils.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/gdb/python/py-utils.c b/gdb/python/py-utils.c index 01fd6ad..6ef0d7e 100644 --- a/gdb/python/py-utils.c +++ b/gdb/python/py-utils.c @@ -384,3 +384,59 @@ gdb_pymodule_addobject (PyObject *module, const char *name, PyObject *object) Py_DECREF (object); return result; } + +/* Handle a Python exception when the special gdb.GdbError treatment + is desired. This should only be called when an exception is set. + If the exception is a gdb.GdbError, throw a gdb exception with the + exception text. For other exceptions, print the Python stack and + then throw a gdb exception. */ + +void +gdbpy_handle_exception () +{ + PyObject *ptype, *pvalue, *ptraceback; + + PyErr_Fetch (&ptype, &pvalue, &ptraceback); + + /* Try to fetch an error message contained within ptype, pvalue. + When fetching the error message we need to make our own copy, + we no longer own ptype, pvalue after the call to PyErr_Restore. */ + + gdb::unique_xmalloc_ptr<char> + msg (gdbpy_exception_to_string (ptype, pvalue)); + + if (msg == NULL) + { + /* An error occurred computing the string representation of the + error message. This is rare, but we should inform the user. */ + printf_filtered (_("An error occurred in Python " + "and then another occurred computing the " + "error message.\n")); + gdbpy_print_stack (); + } + + /* Don't print the stack for gdb.GdbError exceptions. + It is generally used to flag user errors. + + We also don't want to print "Error occurred in Python command" + for user errors. However, a missing message for gdb.GdbError + exceptions is arguably a bug, so we flag it as such. */ + + if (! PyErr_GivenExceptionMatches (ptype, gdbpy_gdberror_exc) + || msg == NULL || *msg == '\0') + { + PyErr_Restore (ptype, pvalue, ptraceback); + gdbpy_print_stack (); + if (msg != NULL && *msg != '\0') + error (_("Error occurred in Python: %s"), msg.get ()); + else + error (_("Error occurred in Python.")); + } + else + { + Py_XDECREF (ptype); + Py_XDECREF (pvalue); + Py_XDECREF (ptraceback); + error ("%s", msg.get ()); + } +} |