2011-12-23 122 views
2

我想用LuaJava从Java调用一个简单的Lua函数。 calc.lua:LuaJava错误处理中的错误

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); (-2); L.insert(-2);

不知道为什么它给出任何错误或错误是什么。也许我没有正确设置错误处理程序?所以它不会打电话?加载后,我尝试从控制台,并可以运行打印(foo(5))如预期恢复10。

更新:它看起来像我需要在堆栈上提供一个错误处理程序。什么是这样的错误处理程序的签名,以及如何将它放在堆栈上的一个点上。谢谢

回答

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) : ""; 
+0

好的。我现在收到错误消息。 – Androider 2011-12-24 02:12:09

+0

这是另一个问题,但现在我得到的错误是试图对局部变量n进行算术运算。 – Androider 2011-12-24 02:43:52

+0

这里是关于产生的错误代码的问题的链接http://stackoverflow.com/questions/8622409/lua-error-attempt-to-perform-arithmetic-on-local-variable – Androider 2011-12-24 03:06:04

0

你为什么提供-2?那不应该在那里。你已经告诉Lua,在Lua栈中存在一个错误函数,它将处理索引-2处的错误,而你的代码并不指明任何类型。在大多数情况下,pcall应该只有两个参数。

+0

好的。我认为这里有一个问题。 LuaState.call(a,b)但是LuaCall.pcall(a,b,error_index)。那么我应该把什么放入error_index? – Androider 2011-12-23 23:29:45

+0

以及如何设置处理程序。我如何设置错误功能? – Androider 2011-12-23 23:30:51

+0

@Androider:默认的应该没问题。你应该没问题,只要'pcall(a,b);'。 – Puppy 2011-12-23 23:41:40