LuaJava Установка обработчика ошибок для LuaState.pcall (a, b, error_function_index)? - PullRequest
4 голосов
/ 24 декабря 2011

Я пытаюсь позвонить:

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 ]

1 голос
/ 24 декабря 2011

Если вы также хотите трассировку стека (я уверен, что вы делаете :), вы можете передать 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...
0 голосов
/ 24 декабря 2011

Предполагается, что у вас есть функция 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);
...