gpt4 book ai didi

python - SWIG 包装 C 库引发异常的最优雅方式

转载 作者:太空狗 更新时间:2023-10-30 02:49:58 24 4
gpt4 key购买 nike

我最近将一个库(我最初使用 Boost Python 包装用 C++ 编写)转换为使用 SWIG 包装的 C,以支持更多语言。我从 C++ 切换到 C,因为该库仅包含一组函数,而且我还希望可以从 C 调用该库(无需使用 C++ 编译器编译整个程序)。然而,有一件事不容易移植,非常小的函数子集需要能够报告错误。在 C++/Boost Python 中,这是通过 throw 和异常转换非常优雅地完成的。

让函数子集报告错误的最优雅的方式(在 C 语言和包装语言方面)是什么?

最佳答案

我就是这样做的。 %{...%} block 将其内容插入包装文件。 %exception block 是 SWIG 的异常处理,在每次函数调用后运行以检查是否有错误,如果有则使用 PyErr_SetString 抛出异常。然后,如果您想抛出异常,只需从您的 C 函数中调用“set_err("Error msg");。

%{
/* Exception helpers */
static int swig_c_error_num = 0;
static char swig_c_err_msg[256];

const char *err_occurred()
{
if (swig_c_error_num) {
swig_c_error_num = 0;
return (const char*)swig_c_err_msg;
}
return NULL;
}

void set_err(const char *msg)
{
swig_c_error_num = 1;
strncpy(swig_c_err_msg, msg, 256);
}
%}

%exception {
const char *err;
$action
if (err = err_occurred()) {
PyErr_SetString(PyExc_RuntimeError, err);
return NULL;
}
}

或者,如果您的 C 库使用一组标准的返回码,您可以用在 %exception block 中检查函数的返回码来替换此机制。

%exception {
int rc;
rc = $action;

if (rc == ERR) {
PyErr_SetString(PyExc_RuntimeError, <err msg>);
return NULL;
}
}

关于python - SWIG 包装 C 库引发异常的最优雅方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5448257/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com