SWIG_exception()将SWIG_运行时错误打印为字符串 我用SWIG封装了我的C++函数,这样我就可以在Lua使用它。

SWIG_exception()将SWIG_运行时错误打印为字符串 我用SWIG封装了我的C++函数,这样我就可以在Lua使用它。,c++,exception,lua,swig,C++,Exception,Lua,Swig,在我的类型映射中,我检查输入是否是表 if (!lua_istable(L, 1)) { SWIG_exception(SWIG_RuntimeError, "argument mismatch: table expected"); } 但是,如果在Lua中调用此函数,则消息打印如下 SWIG_RuntimeError:argument mismatch: table expected 我试图用-3替换SWIG\u RuntimeError,但它只是打印-3,而不是SWI

在我的类型映射中,我检查输入是否是表

if (!lua_istable(L, 1)) {
      SWIG_exception(SWIG_RuntimeError, "argument mismatch: table expected");
    }
但是,如果在Lua中调用此函数,则消息打印如下

SWIG_RuntimeError:argument mismatch: table expected
我试图用
-3
替换
SWIG\u RuntimeError
,但它只是打印
-3
,而不是
SWIG\u RuntimeError

我包括以下内容

%include <stl.i>
%include <std_string.i>
%include <std_except.i>

%include <exception.i>
%include <typemaps.i>
%include
%包括
%包括
%包括
%包括
我尝试不包括
和/或
,但这些都无法解决问题


如何修复此问题?

如果您不喜欢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>);
这是错误消息:

lua5.3:test.i:15:第一个参数的预期表
堆栈回溯:
[C] :在函数“typemaps.test\u typemap”中
test.lua:3:在主块中
[C] :在哪?

第一行告诉我们它在接口文件中出错的位置。在堆栈回溯中,我们随后在Lua输入文件中找到了错误的地方,即在第三行(
test.Lua:3
),我们试图用字符串调用
test\u typemap
)。堆栈回溯实际上是Lua通用的,与SWIG无关。当您调用
error

时,总会得到一个错误,这里的实际问题是什么?您不希望它打印
SWIG\u RuntimeError
,还是要打印其他内容?请记住,Lua不支持异常,因此SWIG将C++异常转换为Lua<代码>错误<代码>。
fail
处的块只调用
lua\u错误(L)
@HenriMenke当我在Lua中生成错误时,它们通常像
[string”;function bang();pd.setArray(“arr”,“123”…]:1:需要一个表
,它准确地显示错误发生的位置。但是,我的包装函数只是打印
SWIG\u RuntimeError:参数不匹配:需要一个表
,它的信息量不如第一个表,所以我想可能应该将
SWIG\u RuntimeError
转换为Lua中的其他字符串,以指定错误发生的位置正在发生。但可能我错了。是否可以使用
SWIG_exception()让它像我的第一个示例那样自动打印
?如果您想知道错误在Lua代码中的位置,只需查看堆栈回溯。要找到错误在接口文件中的位置,您必须调整异常生成器,请参阅我的答案。谢谢!我将为您提供赏金。