【发布时间】:2020-08-25 00:53:47
【问题描述】:
如何改进错误记录以包含行号?这是因为我在读取 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 = ""
});
【问题讨论】:
-
no line number or filename你运行的是 Lua 脚本还是带有调试信息的 Lua 字节码? -
这是一个脚本,而不是字节码。
if (luaL_loadfile(luaState, filename) || lua_pcall(luaState, 0, 0, 0)) {