【发布时间】:2018-06-05 17:04:06
【问题描述】:
我使用 SWIG 包装了我的 C++ 函数,因此我可以在 Lua 中使用它。
在我的 typemap 中,我检查输入是否为表格。
if (!lua_istable(L, 1)) {
SWIG_exception(SWIG_RuntimeError, "argument mismatch: table expected");
}
但是如果在 Lua 中调用它,消息会打印如下。
SWIG_RuntimeError:argument mismatch: table expected
我尝试将SWIG_RuntimeError 替换为-3,但它只打印-3 而不是SWIG_RuntimeError。
我包括以下内容
%include <stl.i>
%include <std_string.i>
%include <std_except.i>
%include <exception.i>
%include <typemaps.i>
我尝试不包括<std_except.i> 和/或<exception.i>,但这些都没有解决问题。
我该如何解决这个问题?
【问题讨论】:
-
这里的实际问题是什么?您不希望它打印
SWIG_RuntimeError还是要打印其他内容?请记住,Lua 不支持异常,因此 SWIG 将 C++ 异常转换为 Luaerror。 -
SWIG 的 Lua 生成器只定义了
#define SWIG_exception(a,b) { lua_pushfstring(L,"%s:%s",#a,b);SWIG_fail; }和#define SWIG_fail {goto fail;}。fail的块只是调用lua_error(L);。 -
@HenriMenke 当我在 Lua 中生成错误时,它们通常会像
[string "; function bang() ; pd.setArray("arr" , "123"..."]:1: expected a table一样打印,这会准确显示错误发生的位置。然而,我的包装函数只是打印SWIG_RuntimeError:argument mismatch: table expected,它不像第一个那样提供信息,所以我认为SWIG_RuntimeError应该转换为 Lua 中的其他字符串以指定错误发生的位置。但也许我错了。是否可以像我的第一个示例一样使用SWIG_exception()使其自动打印? -
如果你想知道错误在 Lua 代码中的位置,只需查看堆栈回溯。要查找错误在接口文件中的位置,您必须调整异常生成器,请参阅我的答案。