4 #include <nanobind/nanobind.h>
6 namespace nb = nanobind;
8 inline std::tuple<nb::object, nb::object, nb::object>
fetch_pyerr() {
12 PyErr_Fetch(&ptype, &pvalue, &ptraceback);
14 return std::make_tuple(nb::steal(ptype), nb::steal(pvalue), nb::steal(ptraceback));
19 if (PyUnicode_Check(python_string)) {
20 auto py_bytes = nb::steal(PyUnicode_AsASCIIString(python_string));
22 str_ = strdup(PyBytes_AsString(py_bytes.ptr()));
24 PyErr_SetString(PyExc_MemoryError,
"strdup in Py2NRNString");
27 }
else if (PyBytes_Check(python_string)) {
28 str_ = strdup(PyBytes_AsString(python_string));
32 PyErr_SetString(PyExc_MemoryError,
"strdup in Py2NRNString");
35 PyErr_SetString(PyExc_TypeError,
"Neither Unicode or PyBytes");
42 auto [err_type, err_value, err_traceback] =
fetch_pyerr();
44 if (err_value && err_type) {
45 auto umes = nb::steal(
46 PyUnicode_FromFormat(
"%s (Note: %S: %S)", message, err_type.ptr(), err_value.ptr()));
47 PyErr_SetObject(
type, umes.ptr());
49 PyErr_SetString(
type, message);
59 auto pstr = nb::steal(PyObject_Str(pvalue.ptr()));
61 const char* err_msg = PyUnicode_AsUTF8(pstr.ptr());
63 str_ = strdup(err_msg);
65 str_ = strdup(
"get_pyerr failed at PyUnicode_AsUTF8");
68 str_ = strdup(
"get_pyerr failed at PyObject_Str");
71 str_ = strdup(
"get_pyerr failed at PyErr_Fetch");
static neuron::unique_cstr as_ascii(PyObject *python_string)
static neuron::unique_cstr get_pyerr()
static void set_pyerr(PyObject *type, const char *message)
A RAII wrapper for C-style strings.
std::tuple< nb::object, nb::object, nb::object > fetch_pyerr()