46 lines
1.8 KiB
C++
46 lines
1.8 KiB
C++
#include "config.hpp"
|
|
#include "fortran.hpp"
|
|
|
|
static void customCosmotoolHandler()
|
|
{
|
|
try {
|
|
if (PyErr_Occurred())
|
|
;
|
|
else
|
|
throw;
|
|
} catch (const CosmoTool::InvalidArgumentException& e) {
|
|
PyErr_SetString(PyExc_ValueError, "Invalid argument");
|
|
} catch (const CosmoTool::NoSuchFileException& e) {
|
|
PyErr_SetString(PyExc_IOError, "No such file");
|
|
} catch (const CosmoTool::InvalidUnformattedAccess& e) {
|
|
PyErr_SetString(PyExc_RuntimeError, "Invalid fortran unformatted access");
|
|
} catch (const CosmoTool::Exception& e) {
|
|
PyErr_SetString(PyExc_RuntimeError, e.what());
|
|
} catch (const std::bad_alloc& exn) {
|
|
PyErr_SetString(PyExc_MemoryError, exn.what());
|
|
} catch (const std::bad_cast& exn) {
|
|
PyErr_SetString(PyExc_TypeError, exn.what());
|
|
} catch (const std::domain_error& exn) {
|
|
PyErr_SetString(PyExc_ValueError, exn.what());
|
|
} catch (const std::invalid_argument& exn) {
|
|
PyErr_SetString(PyExc_ValueError, exn.what());
|
|
} catch (const std::ios_base::failure& exn) {
|
|
// Unfortunately, in standard C++ we have no way of distinguishing EOF
|
|
// from other errors here; be careful with the exception mask
|
|
PyErr_SetString(PyExc_IOError, exn.what());
|
|
} catch (const std::out_of_range& exn) {
|
|
// Change out_of_range to IndexError
|
|
PyErr_SetString(PyExc_IndexError, exn.what());
|
|
} catch (const std::overflow_error& exn) {
|
|
PyErr_SetString(PyExc_OverflowError, exn.what());
|
|
} catch (const std::range_error& exn) {
|
|
PyErr_SetString(PyExc_ArithmeticError, exn.what());
|
|
} catch (const std::underflow_error& exn) {
|
|
PyErr_SetString(PyExc_ArithmeticError, exn.what());
|
|
} catch (const std::exception& exn) {
|
|
PyErr_SetString(PyExc_RuntimeError, exn.what());
|
|
} catch(...) {
|
|
PyErr_SetString(PyExc_RuntimeError, "Unknown exception");
|
|
}
|
|
}
|