在Cython中处理自定义C异常

从Cython调用时,我在处理自定义C异常时遇到一些麻烦.
我的情况如下:我有一个库,它使用CustomLibraryException来处理所有异常.我想要的是基本上得到错误消息并用它引发 Python错误.

user guide有一些提示,但它有点不明确.
第一种可能性是:

cdef int bar()除了ValueError

这会将CustomLibraryException转换为ValueError,但会丢失错误消息.

另一种可能性是使用明确转换错误

cdef int raise_py_error()
cdef int something_dangerous() except +raise_py_error

我真的不明白这个解决方案.我知道raise_py_error必须是一个以某种方式处理错误的C函数.我不知道如何处理它.该函数获取参数,并在C中的catch块内调用.

如果任何人有一个在Cython中处理C异常的工作示例,那将会有很大的帮助.

解决方法

如果CustomLibraryException派生自std :: runtime_error(作为一个表现良好的C异常应该),那么你看到的行为是Cython中的一个错误.

如果没有,那么最简单的方法是将C函数包装在一个转换异常的C帮助函数中:

double foo(char const *,Bla const &);  // this is the one we're wrapping

double foo_that_throws_runtime_error(char const *str,Bla const &blaref)
{
    try {
        return foo(str,blaref);
    } catch (CustomLibraryException const &e) {
        throw std::runtime_error(e.get_the_message());
    }
}

这将导致在Python端引发RuntimeError.或者,抛出一个std :: invalid_argument来引发ValueError等(参见你链接到的页面中的表).

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...