Если вам не нравится стандартный обработчик исключений 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, а именно в третьей строке (test.lua:3
), где мы пытаемся вызвать test_typemap
со строкой.Трассировка стека на самом деле является общей для Lua и не имеет ничего общего с SWIG.Вы всегда получите его, когда позвоните error
.