代码之家  ›  专栏  ›  技术社区  ›  Adam Pierce

使用longjmp在lua中处理错误

  •  3
  • Adam Pierce  · 技术社区  · 15 年前

    我在当前项目中嵌入了一个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需要缓冲区。我必须提供这个还是lua分配一个缓冲区?手册对此有点含糊。

    2 回复  |  直到 15 年前
        1
  •  9
  •   Adam Pierce    15 年前

    经过一些研究和一些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
  •  -1
  •   Nikolai Fetissov    15 年前

    跳转缓冲链是 struct lua_longjmp 指向 errorJmp 处于每线程状态的字段 struct lua_State . 这在lua核心头中定义 lstate.h Here 是相同的交叉引用的强氧剂。

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

    希望这有帮助。