错误处理中的LuaJava错误

时间:2011-12-23 23:16:57

标签: lua 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 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。

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

2 个答案:

答案 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在大多数情况下只应该采用两个参数。