Ошибка LuaJava при обработке ошибок

Я пытаюсь вызвать простую функцию 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 ответа

Решение

Это взято из справочного руководства 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 просто отражает API C, то просто передайте 0, чтобы указать отсутствие специального errfunc. Примерно так должно работать:

int retCode = L.pcall(1, 1, 0);
String errstr = retCode ? L.toString(-1) : "";

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

Другие вопросы по тегам