我使用SWIG封装了我的C ++函数,所以我可以在Lua中使用它。
在我的typemap中,我检查输入是否为table。
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>
,但这些都没有解决问题。
我该如何解决这个问题?
答案 0 :(得分:1)
如果你不喜欢SWIG的标准异常处理程序,你只需编写自己的。但是,这不能在发电机之间移植。
这是我的界面文件:
%module typemaps
%{
#include <vector>
void test_typemap(std::vector<int>) {}
%}
%define lua_exception(msg)
lua_pushfstring(L, "%s:%d: %s\n", __FILE__, __LINE__, msg);
SWIG_fail;
%enddef
%typemap(in) std::vector<int> {
if (!lua_istable(L, 1)) {
lua_exception("expected table for first argument");
}
}
void test_typemap(std::vector<int>);
这是Lua输入文件:
local typemaps = require("typemaps")
typemaps.test_typemap({1,2,3})
typemaps.test_typemap("not a table")
这是错误消息:
lua5.3: test.i:15: expected table for first argument
stack traceback:
[C]: in function 'typemaps.test_typemap'
test.lua:3: in main chunk
[C]: in ?
第一行告诉我们接口文件出错的地方。在堆栈回溯中,我们然后在Lua输入文件中找到它出错的位置,即第3行(test.lua:3
),我们尝试用字符串调用test_typemap
。堆栈回溯实际上是Lua的通用,与SWIG无关。当你致电error
时,你总会得到一个。