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

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

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); Л. вставить (-2);

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

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


person Androider    schedule 23.12.2011    source источник


Ответы (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) : "";
person greatwolf    schedule 24.12.2011
comment
Это другой вопрос, но теперь ошибка, которую я получаю, связана с попыткой выполнить арифметические действия с локальной переменной n. - person Androider; 24.12.2011
comment
Вот ссылка на вопрос о полученном коде ошибки stackoverflow.com/questions/8622409/ - person Androider; 24.12.2011

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

person Puppy    schedule 23.12.2011
comment
в порядке. Я думаю, что здесь есть проблема. LuaState.call(a,b), но LuaCall.pcall(a,b,error_index). Итак, что я должен указать в error_index? - person Androider; 24.12.2011
comment
и как настроить обработчик. Как настроить функцию ошибки? - person Androider; 24.12.2011
comment
@Androider: по умолчанию все должно быть в порядке. Вы должны быть в порядке только pcall(a, b);. - person Puppy; 24.12.2011
comment
Третий параметр необходим для pcall - person Androider; 24.12.2011
comment
Как поместить обработчик ошибок в стек? и какая подпись у этой функции? - person Androider; 24.12.2011
comment
@Androider: не в родном интерфейсе Lua. Я понятия не имею, как сделать обработчик ошибок, но попробуйте поискать пример на lua.org. - person Puppy; 24.12.2011