lsst.pex.exceptions
g786e29fd12+76ce5f0d11
Toggle main menu visibility
Loading...
Searching...
No Matches
include
lsst
pex
exceptions
python
Exception.h
Go to the documentation of this file.
1
/*
2
* This file is part of pex_exceptions.
3
*
4
* Developed for the LSST Data Management System.
5
* This product includes software developed by the LSST Project
6
* (https://www.lsst.org).
7
* See the COPYRIGHT file at the top-level directory of this distribution
8
* for details of code ownership.
9
*
10
* This program is free software: you can redistribute it and/or modify
11
* it under the terms of the GNU General Public License as published by
12
* the Free Software Foundation, either version 3 of the License, or
13
* (at your option) any later version.
14
*
15
* This program is distributed in the hope that it will be useful,
16
* but WITHOUT ANY WARRANTY; without even the implied warranty of
17
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
* GNU General Public License for more details.
19
*
20
* You should have received a copy of the GNU General Public License
21
* along with this program. If not, see <https://www.gnu.org/licenses/>.
22
*/
23
24
#ifndef LSST_PEX_EXCEPTIONS_PYTHON_EXCEPTION_H
25
#define LSST_PEX_EXCEPTIONS_PYTHON_EXCEPTION_H
26
27
#include <string>
28
29
#include <pybind11/pybind11.h>
30
31
#include "
lsst/pex/exceptions/Exception.h
"
32
33
namespace
lsst
{
34
namespace
pex
{
35
namespace
exceptions
{
36
namespace
python
{
37
51
template
<
typename
T,
typename
E = lsst::pex::exceptions::Exception>
52
pybind11::class_<T, E>
declareException
(pybind11::module &mod,
const
std::string
&name,
53
const
std::string
&
base
) {
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
}
100
101
}
// namespace python
102
}
// namespace exceptions
103
}
// namespace pex
104
}
// namespace lsst
105
106
#endif
Exception.h
std::string
std::string::c_str
T c_str(T... args)
lsst::base
lsst::pex::exceptions::python
Definition
Exception.h:36
lsst::pex::exceptions::python::declareException
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.
Definition
Exception.h:52
lsst::pex::exceptions.wrappers.declare
declare(module, exception_name, base, wrapped_class)
Definition
wrappers.py:153
lsst::pex::exceptions
Definition
Exception.h:37
lsst::pex
Definition
Exception.h:36
lsst
Generated on
for lsst.pex.exceptions by
1.17.0