在Cython中处理自定义C异常

前端之家收集整理的这篇文章主要介绍了在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++相关文章