mirror of
https://github.com/pybind/pybind11.git
synced 2026-04-19 22:39:09 +00:00
Added exception translator specific mutex used with try_translate_exceptions (#5362)
* Added exception translator specific mutex used with try_translate_exceptions Fixes #5346 * - Replaced with_internals_for_exception_translator by with_exception_translators - Incremented PYBIND11_INTERNALS_VERSION - Added a test * style: pre-commit fixes * Fixed formatting and added explicit to ctors * Addressed PR review comments --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
@@ -111,6 +111,16 @@ struct PythonAlreadySetInDestructor {
|
||||
py::str s;
|
||||
};
|
||||
|
||||
struct CustomData {
|
||||
explicit CustomData(const std::string &a) : a(a) {}
|
||||
std::string a;
|
||||
};
|
||||
|
||||
struct MyException7 {
|
||||
explicit MyException7(const CustomData &message) : message(message) {}
|
||||
CustomData message;
|
||||
};
|
||||
|
||||
TEST_SUBMODULE(exceptions, m) {
|
||||
m.def("throw_std_exception",
|
||||
[]() { throw std::runtime_error("This exception was intentionally thrown."); });
|
||||
@@ -385,4 +395,33 @@ TEST_SUBMODULE(exceptions, m) {
|
||||
|
||||
// m.def("pass_exception_void", [](const py::exception<void>&) {}); // Does not compile.
|
||||
m.def("return_exception_void", []() { return py::exception<void>(); });
|
||||
|
||||
m.def("throws7", []() {
|
||||
auto data = CustomData("abc");
|
||||
throw MyException7(data);
|
||||
});
|
||||
|
||||
py::class_<CustomData>(m, "CustomData", py::module_local())
|
||||
.def(py::init<const std::string &>())
|
||||
.def_readwrite("a", &CustomData::a);
|
||||
|
||||
PYBIND11_CONSTINIT static py::gil_safe_call_once_and_store<py::object>
|
||||
PythonMyException7_storage;
|
||||
PythonMyException7_storage.call_once_and_store_result([&]() {
|
||||
auto mod = py::module_::import("custom_exceptions");
|
||||
py::object obj = mod.attr("PythonMyException7");
|
||||
return obj;
|
||||
});
|
||||
|
||||
py::register_local_exception_translator([](std::exception_ptr p) {
|
||||
try {
|
||||
if (p) {
|
||||
std::rethrow_exception(p);
|
||||
}
|
||||
} catch (const MyException7 &e) {
|
||||
auto exc_type = PythonMyException7_storage.get_stored();
|
||||
py::object exc_inst = exc_type(e.message);
|
||||
PyErr_SetObject(PyExc_Exception, exc_inst.ptr());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user