From deb3cb238a9f299d7c57f810165e90a1b14b3e6f Mon Sep 17 00:00:00 2001 From: Francesco Biscani Date: Thu, 14 Nov 2019 08:56:58 +0100 Subject: [PATCH] Add exception translation for std::overflow_error. (#1977) --- docs/advanced/exceptions.rst | 2 ++ include/pybind11/detail/internals.h | 1 + tests/test_exceptions.cpp | 1 + tests/test_exceptions.py | 4 ++++ 4 files changed, 8 insertions(+) diff --git a/docs/advanced/exceptions.rst b/docs/advanced/exceptions.rst index 75ac24ae9..75ad7f7f4 100644 --- a/docs/advanced/exceptions.rst +++ b/docs/advanced/exceptions.rst @@ -28,6 +28,8 @@ exceptions: +--------------------------------------+--------------------------------------+ | :class:`std::range_error` | ``ValueError`` | +--------------------------------------+--------------------------------------+ +| :class:`std::overflow_error` | ``OverflowError`` | ++--------------------------------------+--------------------------------------+ | :class:`pybind11::stop_iteration` | ``StopIteration`` (used to implement | | | custom iterators) | +--------------------------------------+--------------------------------------+ diff --git a/include/pybind11/detail/internals.h b/include/pybind11/detail/internals.h index 067780c26..87952daba 100644 --- a/include/pybind11/detail/internals.h +++ b/include/pybind11/detail/internals.h @@ -211,6 +211,7 @@ inline void translate_exception(std::exception_ptr p) { } catch (const std::length_error &e) { PyErr_SetString(PyExc_ValueError, e.what()); return; } catch (const std::out_of_range &e) { PyErr_SetString(PyExc_IndexError, e.what()); return; } catch (const std::range_error &e) { PyErr_SetString(PyExc_ValueError, e.what()); return; + } catch (const std::overflow_error &e) { PyErr_SetString(PyExc_OverflowError, e.what()); return; } catch (const std::exception &e) { PyErr_SetString(PyExc_RuntimeError, e.what()); return; } catch (...) { PyErr_SetString(PyExc_RuntimeError, "Caught an unknown exception!"); diff --git a/tests/test_exceptions.cpp b/tests/test_exceptions.cpp index d30139037..56cd9bc48 100644 --- a/tests/test_exceptions.cpp +++ b/tests/test_exceptions.cpp @@ -116,6 +116,7 @@ TEST_SUBMODULE(exceptions, m) { m.def("throws5", []() { throw MyException5("this is a helper-defined translated exception"); }); m.def("throws5_1", []() { throw MyException5_1("MyException5 subclass"); }); m.def("throws_logic_error", []() { throw std::logic_error("this error should fall through to the standard handler"); }); + m.def("throws_overflow_error", []() {throw std::overflow_error(""); }); m.def("exception_matches", []() { py::dict foo; try { diff --git a/tests/test_exceptions.py b/tests/test_exceptions.py index 6edff9fe4..ac2b3603e 100644 --- a/tests/test_exceptions.py +++ b/tests/test_exceptions.py @@ -79,6 +79,10 @@ def test_custom(msg): m.throws_logic_error() assert msg(excinfo.value) == "this error should fall through to the standard handler" + # OverFlow error translation. + with pytest.raises(OverflowError) as excinfo: + m.throws_overflow_error() + # Can we handle a helper-declared exception? with pytest.raises(m.MyException5) as excinfo: m.throws5()