LSST Applications g0f08755f38+9c285cab97,g1635faa6d4+13f3999e92,g1653933729+a8ce1bb630,g1a0ca8cf93+bf6eb00ceb,g28da252d5a+0829b12dee,g29321ee8c0+5700dc9eac,g2bbee38e9b+9634bc57db,g2bc492864f+9634bc57db,g2cdde0e794+c2c89b37c4,g3156d2b45e+41e33cbcdc,g347aa1857d+9634bc57db,g35bb328faa+a8ce1bb630,g3a166c0a6a+9634bc57db,g3e281a1b8c+9f2c4e2fc3,g414038480c+077ccc18e7,g41af890bb2+fde0dd39b6,g5fbc88fb19+17cd334064,g781aacb6e4+a8ce1bb630,g80478fca09+55a9465950,g82479be7b0+d730eedb7d,g858d7b2824+9c285cab97,g9125e01d80+a8ce1bb630,g9726552aa6+10f999ec6a,ga5288a1d22+2a84bb7594,gacf8899fa4+c69c5206e8,gae0086650b+a8ce1bb630,gb58c049af0+d64f4d3760,gc28159a63d+9634bc57db,gcf0d15dbbd+4b7d09cae4,gda3e153d99+9c285cab97,gda6a2b7d83+4b7d09cae4,gdaeeff99f8+1711a396fd,ge2409df99d+5e831397f4,ge79ae78c31+9634bc57db,gf0baf85859+147a0692ba,gf3967379c6+41c94011de,gf3fb38a9a8+8f07a9901b,gfb92a5be7c+9c285cab97,w.2024.46
LSST Data Management Base Package
Loading...
Searching...
No Matches
Functions
lsst::pex::exceptions::python Namespace Reference

Functions

template<typename T , typename E = lsst::pex::exceptions::Exception>
pybind11::class_< T, E > declareException (pybind11::module &mod, const std::string &name, const std::string &base)
 Helper function for pybind11, used to define new types of exceptions.
 

Function Documentation

◆ declareException()

template<typename T , typename E = lsst::pex::exceptions::Exception>
pybind11::class_< T, E > lsst::pex::exceptions::python::declareException ( pybind11::module & mod,
const std::string & name,
const std::string & base )

Helper function for pybind11, used to define new types of exceptions.

While this function creates the class wrapper, the user is still responsible for adding all constructor and member wrappers to the returned py::class_ object.

Template Parameters
TThe C++ exception to wrap.
EThe C++ base class of T.
Parameters
[in]modModule to insert the exception into.
[in]nameName of the exception in the module.
[in]basePython name of base class (from pex::exceptions).

Definition at line 52 of file Exception.h.

53 {
54 namespace py = pybind11;
55
56 // Wrap T as a new Python exception type with *name* and add it to the module
57 //
58 // Note that all created C++ wrapped type derive from Exception here.
59 // It is only in the pure Python wrapper layer that they get embedded in
60 // a subclass of the requested base.
61 py::class_<T, E> cls(mod, name.c_str());
62
63 // Declare T wrapped by cls as a pex exception and register it
64 // this relies on the pure Python function "declare" defined in "wrappers"
65 // to create a corresponding Python type derived from Python standard Exception
66 auto exceptions =
67 py::reinterpret_steal<py::object>(PyImport_ImportModule("lsst.pex.exceptions.wrappers"));
68 if (!exceptions.ptr()) {
69 PyErr_SetString(PyExc_SystemError, "import failed");
70 throw py::error_already_set();
71 }
72
73 auto declare = py::reinterpret_steal<py::object>(PyObject_GetAttrString(exceptions.ptr(), "declare"));
74 if (!declare.ptr()) {
75 PyErr_SetString(PyExc_SystemError, "could not get declare function from Python");
76 throw py::error_already_set();
77 }
78
79 auto baseCls = py::reinterpret_steal<py::object>(PyObject_GetAttrString(exceptions.ptr(), base.c_str()));
80 if (!baseCls.ptr()) {
81 PyErr_SetString(PyExc_SystemError, "could not get base class");
82 throw py::error_already_set();
83 }
84
85 auto exceptionName = py::reinterpret_steal<py::object>(PYBIND11_FROM_STRING(name.c_str()));
86 if (!exceptionName.ptr()) {
87 PyErr_SetString(PyExc_SystemError, "could not create name string");
88 throw py::error_already_set();
89 }
90
91 auto result = py::reinterpret_steal<py::object>(PyObject_CallFunctionObjArgs(
92 declare.ptr(), mod.ptr(), exceptionName.ptr(), baseCls.ptr(), cls.ptr(), NULL));
93 if (!result.ptr()) {
94 PyErr_SetString(PyExc_SystemError, "could not declare exception");
95 throw py::error_already_set();
96 }
97
98 return cls;
99}
py::object result
Definition _schema.cc:429
declare(module, exception_name, base, wrapped_class)
Definition wrappers.py:153