Ошибка 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
следует принимать только два аргумента в большинстве случаев.