我正在尝试改进运行Lua脚本的程序中的错误处理。 简化版:
function _errH(msg)
print(msg .. "\n" .. debug.traceback(nil, 1))
end
function _main()
-- cause some random error
print(a-2)
end
function main()
xpcall(_main, errH)
end
main()
给我以下调用堆栈(请忽略错误的行号):
stack traceback:
[string ""]:7428: in function '__sub'
[string ""]:7651: in function <[string ""]:7432>
[C]: in function 'xpcall'
[string ""]:7658: in function 'main'
[string ""]:7928: in main chunk
现在我想知道为什么到处都有[string ""]
。
有没有办法影响这些遗失的文本?除了定义函数之外,我还必须命名这些函数吗?
为什么我会看到in function '__sub'
而不是in function '_main'
?
答案 0 :(得分:3)
[string ""]
来自您将块加载到vm中的方式。你没有提供filename作为lua_dofile / lua_loadfile / lua_dostring / lua_loadstring的参数,或者只是在那里给出了空字符串。
请注意,string是lua文件(lua chunk)的名称,而不是函数的名称。
答案 1 :(得分:2)
通常,您可以在loading时分配块名称。辅助函数使用lua_load
,大多数将根据正在加载的内容类型设置块名称:
lua_load
接受块名称luaL_loadfile
将使用文件名luaL_dofile
使用luaL_loadfile
luaL_loadstring
将使用字符串内容luaL_dostring
使用luaL_loadstring
luaL_loadbuffer
接受块名称如果查看luaL_loadstring的源代码:
LUALIB_API int luaL_loadstring (lua_State *L, const char *s) {
return luaL_loadbuffer(L, s, strlen(s), s);
}
请注意,它实际上只是一个使用字符串作为块名称调用luaL_loadbuffer
的便捷函数。因此,需要从以下字符串加载代码:
luaL_loadbuffer(L, s, strlen(s), "=my_chunk");
"=my_chunk"
是debug information中显示的块名称。
名称前面的等号会改变追溯:
my_chunk:1: in main chunk
省略等号的地方将显示:
[string "my_chunk"]:1: in main chunk