[BUGFIX] Fixing pybind11::error_already_set.matches to also work with exception subclasses (#1715)
* Fixing order of arguments in call to PyErr_GivenExceptionMatches in pybind11::error_already_set.matches
* Added tests on error_already_set::matches fix for exception base classes
diff --git a/tests/test_exceptions.cpp b/tests/test_exceptions.cpp
index cf20214..d301390 100644
--- a/tests/test_exceptions.cpp
+++ b/tests/test_exceptions.cpp
@@ -118,10 +118,38 @@
m.def("throws_logic_error", []() { throw std::logic_error("this error should fall through to the standard handler"); });
m.def("exception_matches", []() {
py::dict foo;
- try { foo["bar"]; }
+ try {
+ // Assign to a py::object to force read access of nonexistent dict entry
+ py::object o = foo["bar"];
+ }
catch (py::error_already_set& ex) {
if (!ex.matches(PyExc_KeyError)) throw;
+ return true;
}
+ return false;
+ });
+ m.def("exception_matches_base", []() {
+ py::dict foo;
+ try {
+ // Assign to a py::object to force read access of nonexistent dict entry
+ py::object o = foo["bar"];
+ }
+ catch (py::error_already_set &ex) {
+ if (!ex.matches(PyExc_Exception)) throw;
+ return true;
+ }
+ return false;
+ });
+ m.def("modulenotfound_exception_matches_base", []() {
+ try {
+ // On Python >= 3.6, this raises a ModuleNotFoundError, a subclass of ImportError
+ py::module::import("nonexistent");
+ }
+ catch (py::error_already_set &ex) {
+ if (!ex.matches(PyExc_ImportError)) throw;
+ return true;
+ }
+ return false;
});
m.def("throw_already_set", [](bool err) {