mirror of
https://github.com/RYDE-WORK/pybind11.git
synced 2026-02-05 23:13:36 +08:00
Merge pull request #395 from aldanor/feature/error-already-set-message
error_already_set improvements
This commit is contained in:
commit
587aa328c6
@ -106,12 +106,17 @@ PYBIND11_NOINLINE inline handle get_type_handle(const std::type_info &tp) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
PYBIND11_NOINLINE inline std::string error_string() {
|
PYBIND11_NOINLINE inline std::string error_string() {
|
||||||
PyObject *type, *value, *traceback;
|
if (!PyErr_Occurred()) {
|
||||||
PyErr_Fetch(&type, &value, &traceback);
|
PyErr_SetString(PyExc_RuntimeError, "Unknown internal error occurred");
|
||||||
|
return "Unknown internal error occurred";
|
||||||
|
}
|
||||||
|
|
||||||
std::string errorString;
|
PyObject *type, *value, *traceback;
|
||||||
|
PyErr_Fetch(&type, &value, &traceback);
|
||||||
|
|
||||||
|
std::string errorString;
|
||||||
if (type) {
|
if (type) {
|
||||||
errorString += (std::string) handle(type).str();
|
errorString += handle(type).attr("__name__").cast<std::string>();
|
||||||
errorString += ": ";
|
errorString += ": ";
|
||||||
}
|
}
|
||||||
if (value)
|
if (value)
|
||||||
|
|||||||
@ -104,5 +104,23 @@ test_initializer custom_exceptions([](py::module &m) {
|
|||||||
m.def("throws3", &throws3);
|
m.def("throws3", &throws3);
|
||||||
m.def("throws4", &throws4);
|
m.def("throws4", &throws4);
|
||||||
m.def("throws_logic_error", &throws_logic_error);
|
m.def("throws_logic_error", &throws_logic_error);
|
||||||
});
|
|
||||||
|
|
||||||
|
m.def("throw_already_set", [](bool err) {
|
||||||
|
if (err)
|
||||||
|
PyErr_SetString(PyExc_ValueError, "foo");
|
||||||
|
try {
|
||||||
|
throw py::error_already_set();
|
||||||
|
} catch (const std::runtime_error& e) {
|
||||||
|
if ((err && e.what() != std::string("ValueError: foo")) ||
|
||||||
|
(!err && e.what() != std::string("Unknown internal error occurred")))
|
||||||
|
{
|
||||||
|
PyErr_Clear();
|
||||||
|
throw std::runtime_error("error message mismatch");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PyErr_Clear();
|
||||||
|
if (err)
|
||||||
|
PyErr_SetString(PyExc_ValueError, "foo");
|
||||||
|
throw py::error_already_set();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
@ -1,6 +1,18 @@
|
|||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
|
||||||
|
def test_error_already_set(msg):
|
||||||
|
from pybind11_tests import throw_already_set
|
||||||
|
|
||||||
|
with pytest.raises(RuntimeError) as excinfo:
|
||||||
|
throw_already_set(False)
|
||||||
|
assert msg(excinfo.value) == "Unknown internal error occurred"
|
||||||
|
|
||||||
|
with pytest.raises(ValueError) as excinfo:
|
||||||
|
throw_already_set(True)
|
||||||
|
assert msg(excinfo.value) == "foo"
|
||||||
|
|
||||||
|
|
||||||
def test_custom(msg):
|
def test_custom(msg):
|
||||||
from pybind11_tests import (MyException, throws1, throws2, throws3, throws4,
|
from pybind11_tests import (MyException, throws1, throws2, throws3, throws4,
|
||||||
throws_logic_error)
|
throws_logic_error)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user