Added py::register_exception for simple case (#296)

The custom exception handling added in PR #273 is robust, but is overly
complex for declaring the most common simple C++ -> Python exception
mapping that needs only to copy `what()`.  This add a simpler
`py::register_exception<CppExp>(module, "PyExp");` function that greatly
simplifies the common basic case of translation of a simple CppException
into a simple PythonException, while not removing the more advanced
capabilities of defining custom exception handlers.
This commit is contained in:
Jason Rhinelander
2016-09-16 02:04:15 -04:00
committed by Wenzel Jakob
parent 29b5064e9c
commit b3794f1087
4 changed files with 136 additions and 34 deletions

View File

@@ -22,7 +22,8 @@ def test_python_call_in_catch():
def test_custom(msg):
from pybind11_tests import (MyException, throws1, throws2, throws3, throws4,
from pybind11_tests import (MyException, MyException5, MyException5_1,
throws1, throws2, throws3, throws4, throws5, throws5_1,
throws_logic_error)
# Can we catch a MyException?"
@@ -49,3 +50,25 @@ def test_custom(msg):
with pytest.raises(RuntimeError) as excinfo:
throws_logic_error()
assert msg(excinfo.value) == "this error should fall through to the standard handler"
# Can we handle a helper-declared exception?
with pytest.raises(MyException5) as excinfo:
throws5()
assert msg(excinfo.value) == "this is a helper-defined translated exception"
# Exception subclassing:
with pytest.raises(MyException5) as excinfo:
throws5_1()
assert msg(excinfo.value) == "MyException5 subclass"
assert isinstance(excinfo.value, MyException5_1)
with pytest.raises(MyException5_1) as excinfo:
throws5_1()
assert msg(excinfo.value) == "MyException5 subclass"
with pytest.raises(MyException5) as excinfo:
try:
throws5()
except MyException5_1 as e:
raise RuntimeError("Exception error: caught child from parent")
assert msg(excinfo.value) == "this is a helper-defined translated exception"