为LuaState设置错误处理程序,使用pcall(a,b, error_function_index)。

我正在尝试调用:

LuaState.pcall(num_args,num_returns, error_handler_index).

我需要知道如何为此函数设置错误处理程序。实际上,我认为如果有人展示如何使用LuaJava调用Lua函数并获得数值结果,那将很好。这可能会节省很多时间和问题。我正在查找但找不到错误函数的签名以及如何将其放置在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

现在是否有办法设置错误处理程序?谢谢

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

点赞
stackoverflow用户234175
stackoverflow用户234175

假设你有一个 Lua 函数来处理错误:

function err_handler(errstr)
  -- 进行异常处理,栈会被弹空但控制权还没回到调用方手中
  -- 在这里可以做任何你需要的操作
  return "我捕获了一个错误!" .. 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) );  // "我捕获了一个错误!" .. errstr
}
else
{
    // err_handler, foo 的结果
    finalResult = L.toNumber(-1);
}
// 执行完毕后,将堆栈还原到初始状态
L.pop(2);
2011-12-24 07:09:01
stackoverflow用户221509
stackoverflow用户221509

如果你也想要堆栈回溯(我确定你想要的:),你可以把debug.traceback作为错误函数进行传递。看一看AndroLua中它是如何实现的

基本上,你必须确保你的堆栈设置如下:

  • 错误处理程序(debug.traceback
  • 你要调用的函数
  • 参数

你可以像下面例子中这样做:

L.getGlobal("debug");
L.getField(-1, "traceback");      // 处理程序
L.getGlobal("foo");               // 函数
L.pushNumber(42);                 // 参数
if (L.pcall(1, 1, -3) != 0) { ... // ... 你知道的 ...
2011-12-24 13:51:41