是否是一个好主意(这可能被认为是不良的实践),有时我会在python中返回一个错误而不是提出错误。
def fnA( some_param ):
# use some_param in complicated thing
if some_param is None:
return ValueError( "something went wrong" )
def fnB( param_a ):
val = fnA( param_a )
if isinstance( val, Exception ):
# error path
我一直在尝试从我作为实践写的常规模块中创建一个python c扩展,因为我认为它可以从中受益。 为此,我一直在使用pybind11。 除此之外,它涵盖了我的大部分需求。 我似乎无法创建一个Valueerror并从C(在这种情况下为C ++)返回它。
i我已经查看了Python自己的源代码的文档,但我没有找到不提出异常的方法。 我“找到”/尝试过的是:
auto some_fn() -> PyExc_ValueError* {
PyObject* type;
PyObject* value;
PyObject* traceback;
PyErr_SetString( PyExc_ValueError, "error in my function !!!" );
PyErr_Fetch( &type, &value, &traceback );
PyErr_NormalizeException( &type, &value, &traceback );
if( traceback != NULL ) {
PyException_SetTraceback( value, traceback );
}
PyErr_Clear();
return value;
}
设置例外,获取,将其归一化,清除并返回具体错误。 我认为它会起作用,但甚至没有编译。任何人都可以指向我在C API中创建和返回异常的正确方向吗? 这可能不是真的,但是再说一次,在Python代码中,它很容易,我很难相信它是不可能的。 在任何情况下都要感谢。
在C API中,可以进行类似于您使用Pybind11进行的操作(需要检查
exc_message
auto some_fn() -> PyExc_ValueError* {
PyObject * exc_message = PyUnicode_FromString("error in my function !!!");
PyObject * exception = PyObject_CallOneArg(PyExc_ValueError, exc_message);
return exception;
}