在Cython中处理自定义C异常

在Cython中处理自定义C异常,第1张

概述从Cython调用时,我在处理自定义C异常时遇到一些麻烦. 我的情况如下:我有一个库,它使用CustomLibraryException来处理所有异常.我想要的是基本上得到错误消息并用它引发 Python错误. user guide有一些提示,但它有点不明确. 第一种可能性是: cdef int bar()除了ValueError 这会将CustomLibraryException转换为Value 从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 wrapPingdouble 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等(参见你链接到的页面中的表).

总结

以上是内存溢出为你收集整理的在Cython中处理自定义C异常全部内容,希望文章能够帮你解决在Cython中处理自定义C异常所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1235170.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存