SWIG_exception () печатает SWIG_RuntimeError как строку - PullRequest
0 голосов
/ 05 июня 2018

Я обернул свою функцию C ++ с помощью SWIG, чтобы я мог использовать ее в Lua.

Внутри карты типов я проверяю, является ли ввод таблицей.

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>, но ни один из них не решил проблему.

Как я могу это исправить?

1 Ответ

0 голосов
/ 06 июня 2018

Если вам не нравится стандартный обработчик исключений 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.

...