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

15 投票
2 回答
3644 浏览
提问于 2025-04-16 19:54

我正在用C语言编写一个Python模块。我需要报告一些无法用Python内置异常描述的错误。因此,我想抛出我自己定义的异常。问题是,Python的规定是所有异常都要从BaseException类派生。我知道怎么创建一个派生类型的对象(通过给tp_base成员赋值),但我不知道怎么获取BaseException类型对象的引用。PyExc_BaseException是一个指向PyObject的引用,它表示一个类,而不是一个类型对象。

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

2 个回答

0

我成功地通过使用 (PyTypeObject*)PyExc_BaseException 来设置 tp_base,这样我的自定义异常就能正确地继承自 BaseException 了。

CPython 的源代码 exceptions.c 中有一些很好的提示。

6

在C语言代码中,创建一个新的异常类型最简单的方法就是调用 PyErr_NewException 这个函数。

撰写回答