4 #ifndef CT_CYTHON_FUNC_WRAPPER
5 #define CT_CYTHON_FUNC_WRAPPER
11 #define CANTERA_USE_INTERNAL
15 typedef double(*callback_wrapper)(double,
void*,
void**);
22 CallbackError(
void* type,
void* value) :
24 m_type((PyObject*) type),
25 m_value((PyObject*) value)
31 PyObject* name = PyObject_GetAttrString(m_type,
"__name__");
32 PyObject* value_str = PyObject_Str(m_value);
34 #if PY_MAJOR_VERSION > 2
35 PyObject* name_bytes = PyUnicode_AsASCIIString(name);
36 PyObject* value_bytes = PyUnicode_AsASCIIString(value_str);
38 PyObject* name_bytes = PyObject_Bytes(name);
39 PyObject* value_bytes = PyObject_Bytes(value_str);
43 msg += PyBytes_AsString(name_bytes);
44 Py_DECREF(name_bytes);
46 msg +=
"<error determining exception type>";
52 msg += PyBytes_AsString(value_bytes);
53 Py_DECREF(value_bytes);
55 msg +=
"<error determining exception message>";
59 Py_XDECREF(value_str);
63 virtual std::string
getClass()
const {
76 Func1Py(callback_wrapper callback,
void* pyobj) :
81 double eval(
double t)
const {
82 void* err[2] = {0, 0};
83 double y = m_callback(t, m_pyobj, err);
85 throw CallbackError(err[0], err[1]);
91 callback_wrapper m_callback;
96 CANTERA_CAPI PyObject* pyCanteraError;
102 inline int translate_exception()
105 if (!PyErr_Occurred()) {
110 }
catch (
const CallbackError& exn) {
112 PyErr_SetObject(exn.m_type, exn.m_value);
113 }
catch (
const std::out_of_range& exn) {
114 PyErr_SetString(PyExc_IndexError, exn.what());
116 PyErr_SetString(pyCanteraError, exn.
what());
117 }
catch (
const std::exception& exn) {
118 PyErr_SetString(PyExc_RuntimeError, exn.what());
120 PyErr_SetString(PyExc_Exception,
"Unknown exception");
Base class for exceptions thrown by Cantera classes.
virtual std::string getMessage() const
Method overridden by derived classes to format the error message.
virtual std::string getClass() const
Method overridden by derived classes to indicate their type.
const char * what() const
Get a description of the error.
CanteraError(const std::string &procedure, const std::string &msg, const Args &... args)
Normal Constructor for the CanteraError base class.
Base class for 'functor' classes that evaluate a function of one variable.
virtual doublereal eval(doublereal t) const
Evaluate the function.
Definitions for the classes that are thrown when Cantera experiences an error condition (also contain...