我试图使用LuaJava从Java调用一个简单的Lua函数。 calc.lua:
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。
更新:看起来我需要在堆栈上提供错误处理程序。这种错误处理程序的签名是什么?如何将它放在堆栈上的某个点上。感谢
答案 0 :(得分: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返回的消息
因此,假设LuaJava的API只是镜像C API,那么只需传递0表示没有特殊的errfunc。这样的事情应该有效:
int retCode = L.pcall(1, 1, 0);
String errstr = retCode ? L.toString(-1) : "";
答案 1 :(得分:0)
为什么你提供-2?那应该不存在。你告诉Lua Lua堆栈上存在一个错误函数,它将处理索引-2处的错误,而你的代码并没有指出任何类型的错误。 pcall
在大多数情况下只应该采用两个参数。