如何在C扩展中创建自定义Python异常类型?

如何在C扩展中创建自定义Python异常类型?,python,c,exception,python-c-api,Python,C,Exception,Python C Api,我正在用C编写一个Python模块。我需要报告内置Python异常无法描述的错误。因此,我希望抛出我自己类型的异常。问题是,Python策略是从BaseException类派生所有异常。我知道如何创建派生类型对象(分配给tp_base memeber),但不知道如何获取对BaseException类型对象的引用。PyExc_BaseException是对PyObject的引用,表示类,而不是类型对象 如何从C代码中抛出自定义Python异常?在C代码中创建新异常类型的最简单方法是调用。我通过使用

我正在用C编写一个Python模块。我需要报告内置Python异常无法描述的错误。因此,我希望抛出我自己类型的异常。问题是,Python策略是从BaseException类派生所有异常。我知道如何创建派生类型对象(分配给tp_base memeber),但不知道如何获取对BaseException类型对象的引用。PyExc_BaseException是对PyObject的引用,表示类,而不是类型对象


如何从C代码中抛出自定义Python异常?

在C代码中创建新异常类型的最简单方法是调用。

我通过使用(PyTypeObject*)PyExc_BaseException作为值来设置tp_base,这会导致自定义异常从BaseException正确继承


CPython源代码中有一些关于异常的好提示。c

一个(新样式)类和一个类型对象在Python中是同一件事,所以我不理解您的问题。Sven,我铸造了PyExc_RuntimeError,并将其用作我自己异常的基本类型。到目前为止,还没有发生什么不好的事情(我相信长期运行后的故障是由其他原因引起的)。你能回答我的问题吗,这样我就可以接受你的答案了?我如何向结果类的对象添加成员?我想将错误代码存储在EXACTION对象的某处。@Basilevs:您可以将异常的构造函数参数传递给。
BaseException
的构造函数只是将参数元组存储在
args
属性中。如果你想要一个不同的行为,重写构造函数。那么python端如何访问这个值呢?我喜欢解析args元组。我需要的是提升对象中的额外成员函数。如果PyErr_NewException的dict参数应该存储额外的函数,那么如何从Python端创建新的成员函数?