返回错误,而不是从python capi

问题描述 投票:0回答:1

是否是一个好主意(这可能被认为是不良的实践),有时我会在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

不是null):
python error-handling pybind11 c-api
1个回答
0
投票
auto some_fn() -> PyExc_ValueError* { PyObject * exc_message = PyUnicode_FromString("error in my function !!!"); PyObject * exception = PyObject_CallOneArg(PyExc_ValueError, exc_message); return exception; }

	

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.