Add getters for exception type, value and traceback (#1641)

This commit is contained in:
martinRenou 2019-05-03 14:32:28 +02:00 committed by Wenzel Jakob
parent 9bb3313162
commit 35045eeef8
2 changed files with 12 additions and 8 deletions

View File

@ -1987,12 +1987,12 @@ class gil_scoped_release { };
#endif #endif
error_already_set::~error_already_set() { error_already_set::~error_already_set() {
if (type) { if (m_type) {
error_scope scope; error_scope scope;
gil_scoped_acquire gil; gil_scoped_acquire gil;
type.release().dec_ref(); m_type.release().dec_ref();
value.release().dec_ref(); m_value.release().dec_ref();
trace.release().dec_ref(); m_trace.release().dec_ref();
} }
} }

View File

@ -324,7 +324,7 @@ public:
/// Constructs a new exception from the current Python error indicator, if any. The current /// Constructs a new exception from the current Python error indicator, if any. The current
/// Python error indicator will be cleared. /// Python error indicator will be cleared.
error_already_set() : std::runtime_error(detail::error_string()) { error_already_set() : std::runtime_error(detail::error_string()) {
PyErr_Fetch(&type.ptr(), &value.ptr(), &trace.ptr()); PyErr_Fetch(&m_type.ptr(), &m_value.ptr(), &m_trace.ptr());
} }
error_already_set(const error_already_set &) = default; error_already_set(const error_already_set &) = default;
@ -335,7 +335,7 @@ public:
/// Give the currently-held error back to Python, if any. If there is currently a Python error /// Give the currently-held error back to Python, if any. If there is currently a Python error
/// already set it is cleared first. After this call, the current object no longer stores the /// already set it is cleared first. After this call, the current object no longer stores the
/// error variables (but the `.what()` string is still available). /// error variables (but the `.what()` string is still available).
void restore() { PyErr_Restore(type.release().ptr(), value.release().ptr(), trace.release().ptr()); } void restore() { PyErr_Restore(m_type.release().ptr(), m_value.release().ptr(), m_trace.release().ptr()); }
// Does nothing; provided for backwards compatibility. // Does nothing; provided for backwards compatibility.
PYBIND11_DEPRECATED("Use of error_already_set.clear() is deprecated") PYBIND11_DEPRECATED("Use of error_already_set.clear() is deprecated")
@ -344,10 +344,14 @@ public:
/// Check if the currently trapped error type matches the given Python exception class (or a /// Check if the currently trapped error type matches the given Python exception class (or a
/// subclass thereof). May also be passed a tuple to search for any exception class matches in /// subclass thereof). May also be passed a tuple to search for any exception class matches in
/// the given tuple. /// the given tuple.
bool matches(handle ex) const { return PyErr_GivenExceptionMatches(ex.ptr(), type.ptr()); } bool matches(handle ex) const { return PyErr_GivenExceptionMatches(ex.ptr(), m_type.ptr()); }
const object& type() const { return m_type; }
const object& value() const { return m_value; }
const object& trace() const { return m_trace; }
private: private:
object type, value, trace; object m_type, m_value, m_trace;
}; };
/** \defgroup python_builtins _ /** \defgroup python_builtins _