mirror of
https://github.com/ceph/ceph
synced 2025-02-23 19:17:37 +00:00
mgr: fixes python error handling
The current `handle_pyerror` function implementation relies in the `traceback.format_exception_only` python function to format the exception object. The problem is that this python function might also raise an exception. This commit fixes it by enclosing that python function call in try...catch block. Fixes: http://tracker.ceph.com/issues/23406 Signed-off-by: Ricardo Dias <rdias@suse.com>
This commit is contained in:
parent
a392e612cc
commit
072699d863
@ -40,10 +40,30 @@ std::string handle_pyerror()
|
||||
object traceback(import("traceback"));
|
||||
if (!tb) {
|
||||
object format_exception_only(traceback.attr("format_exception_only"));
|
||||
formatted_list = format_exception_only(hexc, hval);
|
||||
try {
|
||||
formatted_list = format_exception_only(hexc, hval);
|
||||
} catch (error_already_set const &) {
|
||||
// error while processing exception object
|
||||
// returning only the exception string value
|
||||
PyObject *name_attr = PyObject_GetAttrString(exc, "__name__");
|
||||
std::stringstream ss;
|
||||
ss << PyString_AsString(name_attr) << ": " << PyString_AsString(val);
|
||||
Py_XDECREF(name_attr);
|
||||
return ss.str();
|
||||
}
|
||||
} else {
|
||||
object format_exception(traceback.attr("format_exception"));
|
||||
formatted_list = format_exception(hexc,hval, htb);
|
||||
try {
|
||||
formatted_list = format_exception(hexc, hval, htb);
|
||||
} catch (error_already_set const &) {
|
||||
// error while processing exception object
|
||||
// returning only the exception string value
|
||||
PyObject *name_attr = PyObject_GetAttrString(exc, "__name__");
|
||||
std::stringstream ss;
|
||||
ss << PyString_AsString(name_attr) << ": " << PyString_AsString(val);
|
||||
Py_XDECREF(name_attr);
|
||||
return ss.str();
|
||||
}
|
||||
}
|
||||
formatted = str("").join(formatted_list);
|
||||
return extract<std::string>(formatted);
|
||||
|
Loading…
Reference in New Issue
Block a user