我想打电话:
LuaState.pcall(num_args,num_returns, error_handler_index).
我需要知道如何为此函数设置错误处理程序。事实上,我认为有人展示如何调用Lua函数并使用LuaJava获取数值结果会很好。这可能会节省大量时间和问题。我正在寻找但没有找到错误函数的签名,以及如何将它放在LuaState堆栈上的正确位置。所有Java-> Lua示例都要么打印一个没有返回的值,要么是在使用Lua传入的Java对象上设置值。我想看看如何直接调用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
现在还有办法设置错误处理程序吗?感谢
答案 0 :(得分:1)
如果您还想要堆栈回溯(我确定您这样做:),您可以将debug.traceback
作为错误函数传递。看一下how it's implemented in 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...
答案 1 :(得分:0)
假设你有一个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);