Lua 设置默认错误处理器。
2015-5-4 2:55:6
收藏:0
阅读:220
评论:2
默认的lua_pcall错误处理程序(自Lua 5.3起)不执行任何操作,使异常消息保留在堆栈顶部。我们希望更改它,以便在lua_pcall失败时除了异常消息之外,我们还可以获得luaL_traceback回溯。
不幸的是,我认为这意味着我们需要在所有pcall的下方插入错误处理程序。最稳健的做法似乎是这样的:
/* push function and arguments */
lua_pushstuff...
/* push error handler */
lua_pushcfunction(L, my_error_handler);
/* move the error handler just below the function and arguments */
lua_insert(L, -(number of args + 1));
if (lua_pcall(L, nargs, nresults, -(number of args + 1))) {
/* error here (my_error_handler was invoked) */
/* do something with lua_tostring(L, -1) */
}
/* afterwards, pop the error handler (it may be below return values) */
lua_pop(L, 1);
但是这会在每个pcall中引入噪声(因为我们有很多,因为我们有一些从C异步调用的Lua回调),并且感觉有点重复。我认为这可以包装在某些lua_mypcall函数内,自动执行这些设置工作,但是我有两个问题:
1.在pcall之前(或内部)进行了更复杂的堆栈操作,这种方法是否容易出错? (我对Lua堆栈还不是很熟悉)
2.由于我们希望在大多数pcall上获得回溯,因此将该错误处理程序设置为默认值并手动指定先前没有任何操作的先前错误处理程序是有意义的,因此是否有一种方法可以全局更改Lua状态的默认错误处理程序?
我看到lua_pcallk中有一些代码用于errfunc == 0,但它似乎不能配置。我们可以修改Lua实现以手动更改默认设置,但是希望避免这样做。
我们正在使用Lua 5.3。谢谢。
点赞
用户2170324
如果(lua_pcall(L,0,0,0)!=LUA_OK) fprintf(stderr,"%s\n", lua_tostring(L,-1) );
约等于:
如果调用函数 lua_pcall(L,0,0,0) 返回值不等于 LUA_OK,那么输出错误信息到 stderr,错误信息为栈顶元素(在 Lua 栈中的索引为 -1)的字符串表达式。
2022-04-19 17:54:25
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
你的基本方法是对的,但是你缺少了一个
lua_remove(而不是lua_pop),并且你的栈索引是错误的。尝试这个:int lua_mypcall( lua_State* L, int nargs, int nret ) { /* 计算消息处理程序的堆栈位置 */ int hpos = lua_gettop( L ) - nargs; int ret = 0; /* 推送自定义错误消息处理程序 */ lua_pushcfunction( L, my_error_handler ); /* 将其放在函数和参数之前 */ lua_insert( L, hpos ); /* 调用带有自定义处理程序的 lua_pcall 函数 */ ret = lua_pcall( L, nargs, nret, hpos ); /* 从堆栈中删除自定义错误消息处理程序 */ lua_remove( L, hpos ); /* 传递 lua_pcall 的返回值 */ return ret; }