2011-12-23 3 views
2

Я пытаюсь вызвать простую функцию Lua из Java с помощью LuaJava. calc.lua:Ошибка 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); L.insert (-2);

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

UPDATE: Похоже, мне нужно предоставить обработчик ошибок в стеке. Что такое подпись для такого обработчика ошибок и как я могу поместить его в точку в стеке. Спасибо

ответ

1

Это берется из справочника Lua - под C API section он говорит это о 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) : ""; 
+0

ОК. Я получаю сообщение об ошибке сейчас. – Androider

+0

Это еще один вопрос, но теперь ошибка, которую я получаю, пытается сделать арифметику на локальной переменной n. – Androider

+0

Ссылка на вопрос о полученном коде ошибки http://stackoverflow.com/questions/8622409/lua-error-attempt-to-perform-arithmetic-on-local-variable – Androider

0

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

+0

ok. Я думаю, что здесь есть проблема. LuaState.call (a, b), но LuaCall.pcall (a, b, error_index). Итак, что мне добавить в error_index? – Androider

+0

и как настроить обработчик. Как настроить функцию ошибки? – Androider

+0

@ Androider: По умолчанию все должно быть хорошо. Вы должны быть в порядке только для 'pcall (a, b);'. – Puppy

Смежные вопросы