如何改进 Lua 内部错误信息以包括行号?
2020-8-25 0:53:48
收藏:0
阅读:269
评论:1
如何改进错误日志以包括行号?这是在我读取 Lua 文件时抛出的内部错误。我只收到 attempt to index a function value 的错误消息,没有行号或文件名。
void handleLuaError(lua_State* L, const char* msg, const char* filename) {
handleError("%s %s: %s", msg, filename, lua_tostring(luaState, -1));
lua_pop(L, 1);
luaL_traceback (L, L, msg, 2);
char* result = 0;
if (lua_isstring(L, -1)) result = strdup_s(lua_tostring(L, -1));
lua_pop(L, 1);
SPDLOG_WARN("traceback: {}", result);
}
void readLua(const char *filename) {
SPDLOG_INFO("readLua {}", filename);
if (luaL_loadfile(luaState, filename) || lua_pcall(luaState, 0, 0, 0)) {
handleLuaError(luaState, "Reading file", filename);
}
}
我尝试添加了 luaL_traceback,就像你看到的那样,但是我从 luaL_traceback 收到的唯一消息是 stack traceback:,没有实际的回溯信息。我读到 lua_pcall 可以损毁堆栈,并且需要在错误处理程序中进行一些调试日志记录,而不是在 lua_pcall 返回后进行。有人建议我需要使用 xpcall 并提供自定义错误处理程序,但我找不到任何有关在 C++ 中调用 xpcall 的文档或示例代码。
如何设置自定义错误处理程序?或者是否有一种方法只是告诉 Lua 在内部错误中放置更多信息?当我在其他人的 StackOverflow 帖子中看到我的特定错误消息时,错误消息(attempt to index ...)显示文件名和行号,所以应该可以通过此错误获取文件名和行号。
这里是导致错误的 Lua 文件:
addAchievement({
code = "AchNewCity",
name = "A New City",
text = "Welcome to NewCity. " ..
"Your first task is to " ..
"build some roads. Click " ..
"on the Transportation Tool in the " ..
"bottom left corner.",
condition = "true",
effect = "FRoadTool,FRoadStreet",
hint = ""
});
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的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 代码?

如果有疑问,请查看原始源代码进行参考,Lua拥有一个解释器lua.c,可以完全实现您所需的功能。您应该关注
msghandler、docall和report。lua_pcall接受消息处理程序的索引作为第四个参数。它可用于检索有关错误环境等的信息。执行lua_pcall后,您将无法执行此操作(此时堆栈已展开)。您的代码应该更像这样:
int handleLuaError(lua_State* L) { const char * msg = lua_tostring(L, -1); luaL_traceback(L, L, msg, 2); lua_remove(L, -2); // 从堆栈中删除错误/"msg" return 1; // 返回回溯信息 } void readLua(const char *filename) { SPDLOG_INFO("readLua {}", filename); lua_pushcfunction(luaState, handleLuaError); if (LUA_OK != (luaL_loadfile(luaState, filename) || lua_pcall(luaState, 0, 0, -2))) { // handleLuaError's index ^^^ handleError("Reading file %s: %s", filename, lua_tostring(luaState, -1)); lua_pop(luaState, 1); // 从堆栈中弹出回溯信息 } lua_pop(luaState, 1); // 从堆栈中弹出handleLuaError }现在,这是一个相当简单的实现。您应该考虑将
luaL_loadfile和lua_pcall拆分以针对与加载文件直接相关的错误作出反应。同样,您可以参考解释器的源代码:dofile,然后是dochunk。此外,上面的示例缺少大部分重要检查,特别是测试
lua_tostring是否成功,除非您百分之百地确定返回的错误始终可以轻松转换为字符串。似乎您有两个并存的状态:
luaState和偶尔的L。我建议您查看一下,这可能会在未来节省一些问题。还有一件事,除了
luaL_traceback之外,您可能还需要关注luaL_where。它在内部与luaL_error一起使用。