【发布时间】:2018-12-04 10:52:49
【问题描述】:
我有一段代码试图将对象解析为整数:
long val = PyLong_AsLong(obj);
if(val == -1 && PyErr_Occurred()) {
return -1;
}
这里的obj 是一个普通的PyObject *,如果obj 不是整数,PyLong_AsLong 会引发一个非常通用的TypeError。
我想将错误消息转换成更丰富的信息,所以我想修改现有的错误对象,或者重新提出它。
我目前的解决方案是这样做:
long val = PyLong_AsLong(obj);
if(val == -1 && PyErr_Occurred()) {
PyErr_Clear();
PyErr_Format(PyExc_TypeError, "Parameter must be an integer type, but got %s", Py_TYPE(obj)->tp_name);
return -1;
}
这是重新引发错误的正确方法吗?具体来说,
- 我需要打电话给
PyErr_Clear吗?我怀疑它正确地定义了现有的异常对象,但我不确定。 - 我可以修改当时已经抛出的错误消息而不重新引发它吗?
- 是否有与
raise new_err from old_err等效的选项?
我不知道如何在这种情况下使用PyErr_SetExcInfo,尽管我的直觉告诉我它可能以某种方式相关。
【问题讨论】:
标签: python python-3.x exception-handling python-c-api