LuaJava中的错误在错误处理中。

我正在使用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的值始终为5pcall(numArgs,numRet,errHandler)
String s = L.toString(-1);     // s= "Error in Error Handling Code"

我还尝试过

L.remove(-2); L.insert(-2);

不确定为什么仍然会出现错误或错误是什么。也许我没有正确设置错误处理程序?因此不进行调用?在加载完成后,我尝试从控制台运行print(foo(5)),并如预期地获得10。

更新:看起来我需要在堆栈上提供一个错误处理程序。这种错误处理程序的签名是什么,我应该如何将它放置在堆栈上?谢谢。

原文链接 https://stackoverflow.com/questions/8621471

点赞
stackoverflow用户298661
stackoverflow用户298661

为什么你提供了-2?那里本不应该有这个。你告诉 Lua 在 Lua 栈上存在一个错误函数来处理索引为 -2 处的错误,而你的代码并没有表明任何这样的内容。在大多数情况下,pcall 只应该有两个参数。

2011-12-23 23:25:42
stackoverflow用户234175
stackoverflow用户234175

这个内容摘自 Lua 的参考手册——在 C API 部分 中,它这样描述 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) : "";
2011-12-24 01:47:23