error.cpp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. #include "test.h"
  2. TEST_F(PYBIND11_TEST, exception_python_to_cpp) {
  3. auto test = [](const char* code, py_Type type) {
  4. try {
  5. py::exec(code);
  6. } catch(py::python_error& e) {
  7. EXPECT_TRUE(e.match(type));
  8. }
  9. };
  10. test("raise ValueError()", tp_ValueError);
  11. test("raise KeyError()", tp_KeyError);
  12. test("raise IndexError()", tp_IndexError);
  13. test("raise StopIteration()", tp_StopIteration);
  14. test("raise Exception()", tp_Exception);
  15. }
  16. TEST_F(PYBIND11_TEST, exception_cpp_to_python) {
  17. auto m = py::module_::__main__();
  18. #define TEST_EXCEPTION(cppe, pye) \
  19. m.def("test_" #cppe, []() { \
  20. throw cppe(#cppe); \
  21. }); \
  22. py::exec("try:\n test_" #cppe "()\nexcept Exception as e:\n assert isinstance(e, " #pye \
  23. ")\n assert str(e) == '" #cppe "'")
  24. using namespace std;
  25. TEST_EXCEPTION(runtime_error, RuntimeError);
  26. TEST_EXCEPTION(domain_error, ValueError);
  27. TEST_EXCEPTION(invalid_argument, ValueError);
  28. TEST_EXCEPTION(length_error, ValueError);
  29. TEST_EXCEPTION(out_of_range, IndexError);
  30. TEST_EXCEPTION(range_error, ValueError);
  31. using namespace py;
  32. m.def("test_stop_iteration", []() {
  33. throw py::stop_iteration();
  34. });
  35. py::exec("try:\n test_stop_iteration()\nexcept StopIteration as e:\n pass");
  36. TEST_EXCEPTION(index_error, IndexError);
  37. // FIXME: TEST_EXCEPTION(key_error, KeyError);
  38. TEST_EXCEPTION(value_error, ValueError);
  39. TEST_EXCEPTION(type_error, TypeError);
  40. TEST_EXCEPTION(import_error, ImportError);
  41. TEST_EXCEPTION(attribute_error, AttributeError);
  42. TEST_EXCEPTION(runtime_error, RuntimeError);
  43. }