加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 22:19:57 所属栏目:大数据 来源:网络整理
导读:为何使用lua_atpanic 当调用无保护的lua_call后,如果调用栈发生错误(lua_error),那么默认行为是直接退出宿主程序。(可以参考这篇文章) 要避免这样的情况,一种方法是定义自己的panic函数,并作为参数调用lua_atpanic;此外为了避免退出宿主程序,自定义的
为何使用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("%sn",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; }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读