improved error handling at module import time

This commit is contained in:
Wenzel Jakob 2015-12-26 14:04:52 +01:00
parent 9d573f44b9
commit dd57a34e2d
2 changed files with 18 additions and 3 deletions

View File

@ -67,12 +67,24 @@
#endif #endif
#if PY_MAJOR_VERSION >= 3 #if PY_MAJOR_VERSION >= 3
#define PYBIND11_PLUGIN(name) \ #define PYBIND11_PLUGIN_IMPL(name) \
extern "C" PYBIND11_EXPORT PyObject *PyInit_##name() extern "C" PYBIND11_EXPORT PyObject *PyInit_##name()
#else #else
#define PYBIND11_PLUGIN(name) \ #define PYBIND11_PLUGIN_IMPL(name) \
extern "C" PYBIND11_EXPORT PyObject *init##name() extern "C" PYBIND11_EXPORT PyObject *init##name()
#endif #endif
#define PYBIND11_PLUGIN(name) \
static PyObject *pybind11_init(); \
PYBIND11_PLUGIN_IMPL(name) { \
try { \
return pybind11_init(); \
} catch (const std::exception &e) { \
PyErr_SetString(PyExc_ImportError, e.what()); \
return nullptr; \
} \
} \
PyObject *pybind11_init()
NAMESPACE_BEGIN(pybind11) NAMESPACE_BEGIN(pybind11)

View File

@ -471,7 +471,10 @@ public:
} }
static module import(const char *name) { static module import(const char *name) {
return module(PyImport_ImportModule(name), false); PyObject *obj = PyImport_ImportModule(name);
if (!obj)
throw std::runtime_error("Module \"" + std::string(name) + "\" not found!");
return module(obj, false);
} }
}; };