微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当使用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 <lua.h> #include <lauxlib.h> #include <lualib.h> #include <stdio.h> #include <setjmp.h> 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);             else                      /* second jmp,error */           ret = 1;      else        ret = 1; lua_close(L); return ret; }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐