在Lua中使用longjmp进行错误处理。

我正在将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会分配一个缓冲区?手册在这方面有点含糊不清。

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

点赞
stackoverflow用户106671
stackoverflow用户106671

跳过缓冲区链是由 struct lua_State 中的 errorJmp 字段指向的 struct lua_longjmp 的一部分。此定义在 Lua 核心头文件lstate.h中。这里提供了同样交叉引用的 Doxygen。

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

希望这能帮到你。

2010-02-16 02:27:09
stackoverflow用户5324
stackoverflow用户5324

经过一番研究,读了一些代码之后,我解决了这个问题。我一开始就完全跑偏了。

尽管 Lua API 参考手册上说 longjmp 用于错误处理,但 longjmp buffer 在 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");
2010-02-16 07:22:48