LuaJava Установка обработчика ошибок для LuaState.pcall(a,b, error_function_index)?
Я пытаюсь позвонить:
LuaState.pcall(num_args,num_returns, error_handler_index).
Мне нужно знать, как установить обработчик ошибок для этой функции. На самом деле, я думаю, было бы неплохо, если бы кто-то показал, как вызывать функцию Lua и получить численный результат с помощью LuaJava. Это может сэкономить много времени и вопросов. Я смотрю, но не нахожу сигнатуру для функции ошибки и как разместить ее в нужной точке стека LuaState. Все примеры Java->Lua либо печатают значение без возврата, либо задают значения для объекта Java, переданного с использованием Lua. Я хотел бы посмотреть, как вызвать функцию Lua напрямую и получить результат обратно.
Обновление: одно из решений - не передавать обработчик ошибок, используя LuaState.pcall(1,1,0), передавая ноль для обработчика ошибок:
String errorStr;
L.getGlobal("foo");
L.pushNumber(8.0);
int retCode=L.pcall(1,1,0);
if (retCode!=0){
errorStr = L.toString(-1);
}
double finalResult = L.toNumber(-1);
где calc.lua был загружен:
function foo(n)
return n*2
end
Есть ли способ установить обработчик ошибок? Спасибо
2 ответа
Если вы также хотите трассировку стека (я уверен, что вы делаете:), вы можете передать debug.traceback
как функция ошибок. Посмотрите, как это реализовано в AndroLua.
По сути, вы должны убедиться, что ваш стек настроен следующим образом:
- Обработчик ошибок (
debug.traceback
) - Функция, которую вы хотите вызвать
- параметры
Вы можете сделать это следующим образом:
L.getGlobal("debug");
L.getField(-1, "traceback"); // the handler
L.getGlobal("foo"); // the function
L.pushNumber(42); // the parameters
if (L.pcall(1, 1, -3) != 0) { ... // ... you know the drill...
Предполагая, что у вас есть функция Lua где-то для обработки ошибки:
function err_handler(errstr)
-- exception in progress, stack's unwinding but control
-- hasn't returned to caller yet
-- do whatever you need in here
return "I caught an error! " .. errstr
end
Вы можете передать это err_handler
функция в вашем pcall:
double finalResult;
L.getGlobal("err_handler");
L.getGlobal("foo");
L.pushNumber(8.0);
// err_handler, foo, 8.0
if (L.pcall(1, 1, -3) != 0)
{
// err_handler, error message
Log.LogError( L.toString(-1) ); // "I caught an error! " .. errstr
}
else
{
// err_handler, foo's result
finalResult = L.toNumber(-1);
}
// After you're done, leave the stack the way you found it
L.pop(2);