当使用lua_call时,请用lua_atpanic为其设置panic函数

为何使用lua_atpanic
当调用无保护的lua_call后,如果调用栈发生错误(lua_error),那么默认行为是直接退出宿主程序。(可以参考这篇文章)
要避免这样的情况,一种方法是定义自己的panic函数,并作为参数调用lua_atpanic;此外为了避免退出宿主程序,自定义的panic函数应该永不返回(通常是做一个长跳转,令其跳转至lua_call调用点,不过这种做法几乎与lua_pcall无异)
lua_atpanic 1. lua_atpanic设置新panic函数并返回旧的panic函数。
2. 当在无保护环境下发生错误,lua调用当前的panic函数并呼叫exit(EXIT_FAILURE)退出宿主程序。
3. 我们可以提供自己的panic函数以避免退出宿主程序。(一种方法是做一个长跳转(long jump))
4. panic函数可以访问位于栈顶的错误讯息。
示例

#include
#include
#include
#include
#include static jmp_buf jbuf; int
panichandler(lua_State *L)     printf("%s\n", lua_tostring(L, 1));
    lua_pop(L, 1);
    longjmp(&jbuf, 1);    
} int 
main(int argc, char *argv[]) lua_State *L;
int        ret = 0;
if ((L = lua_open()) == NULL) {
    printf("lua_open() failed!\n");
    return 1;
} luaL_openlibs(L);
lua_atpanic(L, panichandler); if (luaL_loadfile(L, "main.lua") == 0) {    
      if (setjmp(&jbuf) == 0)   /* first jmp */
          lua_call(L, 0, 0);      
      else                      /* second jmp, error */
          ret = 1;      else 
      ret = 1; lua_close(L);
return ret;
}

你可能感兴趣的:(lua,编程,c++编程)