从Cython调用时,我在处理自定义C异常时遇到一些麻烦.
我的情况如下:我有一个库,它使用CustomLibraryException来处理所有异常.我想要的是基本上得到错误消息并用它引发 Python错误.
我的情况如下:我有一个库,它使用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等(参见你链接到的页面中的表).