【问题标题】:Error handling in Lua using longjmp使用 longjmp 在 Lua 中处理错误
【发布时间】:2010-02-16 00:57:33
【问题描述】:

我正在我当前的项目中嵌入一个 Lua 解释器(用 C 编写),我正在寻找一个如何处理错误的示例。这就是我目前所拥有的......

if(0 != setjmp(jmpbuffer)) /* Where does this buffer come from ? */
{
   printf("Aargh an error!\n");
   return;
}
lua_getfield(L, LUA_GLOBALSINDEX, "myfunction");
lua_call(L, 0, 0);
printf("Lua code ran OK.\n");

手册只是说使用 longjmp 函数会引发错误,但 longjmp 需要一个缓冲区。我必须提供那个还是 Lua 分配一个缓冲区?手册对此有点含糊。

【问题讨论】:

    标签: c error-handling lua


    【解决方案1】:

    经过一些研究和一些 RTFS,我已经解决了这个问题。我一直在吠叫完全错误的树。

    尽管 Lua API 参考表明 longjmp 用于错误处理,但 longjmp 缓冲区根本不会通过 API 公开。

    要捕获 Lua 函数中的错误,您需要使用 lua_pcall()。我的代码示例可以像这样重写并且可以正常工作:

    lua_getfield(L, LUA_GLOBALSINDEX, "myfunction");
    
    if(0 != lua_pcall(L, 0, 0, 0))
       printf("Lua error: %s\n", lua_tostring(L, -1));
    else
       printf("Lua code ran OK.\n");
    

    【讨论】:

      【解决方案2】:

      跳转缓冲区链是每个线程状态struct lua_StateerrorJmp 字段指向的struct lua_longjmp 的一部分。这是在 Lua 核心头文件lstate.h 中定义的。 Here 是相同的交叉引用的 Doxygen。

      我认为(我不是 Lua 专家)你应该使用 LUAI_TRY 宏。

      希望这会有所帮助。

      【讨论】:

      • 嗯,我可能用这个来找错树了,在做了一些 RTFS 之后,我认为整个 setjmp/longjmp 事情可能在 Lua 内部。也许错误是通过我尚未解决的其他方式处理的。我还在调查。
      • 好的,我解决了。如果我想捕捉错误,我需要使用 lua_pcall 函数。
      猜你喜欢
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多