Ошибка LuaJava при обработке ошибок - PullRequest
2 голосов
/ 24 декабря 2011

Я пытаюсь вызвать простую функцию Lua из Java, используя LuaJava.calc.lua:

function foo(n) return n*2 end

Это все, что есть в calc.lua и последующие вызовы из командной строки работают.

Вот вызов, который всегда имеет ошибку:

L.getGlobal("foo");     
L.pushNumber(8.0);
int retCode=L.pcall(1, 1,-2); // retCode value is always 5 pcall(numArgs,numRet,errHandler)
String s = L.toString(-1);     // s= "Error in Error Handling Code"

Я также пытался
L.remove (-2);L.insert (-2);

Не уверен, почему он дает какую-либо ошибку или что это за ошибка.Может я неправильно настраиваю обработчик ошибок?Так не звонит?После загрузки я попытался с консоли и могу запустить print (foo (5)), возвращая 10, как и ожидалось.

ОБНОВЛЕНИЕ: похоже, мне нужно предоставить обработчик ошибок в стеке.Какая подпись для такого обработчика ошибок и как бы я поместил его в точку в стеке.Спасибо

Ответы [ 2 ]

1 голос
/ 24 декабря 2011

Это взято из справочного руководства Lua - в разделе C API это говорит о pcall:

Когда вы вызываете функцию с помощью lua_call, любая ошибка внутри вызываемой функции распространяется вверх (с longjmp). Если вам нужно обработать ошибки, используйте lua_pcall:

  int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc);

...

Если errfunc равен 0, то возвращаемое сообщение об ошибке является точно исходное сообщение об ошибке . В противном случае errfunc дает индекс стека для функция обработчика ошибок. (В текущей реализации этот индекс не может быть псевдоиндексом.) В случае ошибок времени выполнения эта функция будет вызвано с сообщением об ошибке, и его возвращаемое значение будет сообщение, возвращаемое lua_pcall

Таким образом, предполагая, что API LuaJava просто зеркально отображает C API, затем просто передайте 0, чтобы указать отсутствие специального errfunc Примерно так должно работать:

int retCode = L.pcall(1, 1, 0);
String errstr = retCode ? L.toString(-1) : "";
0 голосов
/ 24 декабря 2011

С какой стати вы предоставили -2?Этого не должно быть там.Вы сказали Lua, что в стеке Lua существует функция ошибок, которая будет обрабатывать ошибки с индексом -2, в то время как ваш код не указывает ничего подобного.pcall в большинстве случаев должно принимать только два аргумента.

...