如何在错误消息中显示正确的函数名称?

时间:2013-11-27 11:29:51

标签: lua

让我们说我通过变量间接调用某些函数。例如:

obj = {

  on_init = function()
    print "hello."
  end,

  on_destroy = function()
    print "bye."
  end,

  on_do_something = function()
    print "doing something."
    error("Hi de hi, hi de ho!")
  end,

}

local event = "do_something"
local func = obj["on_" .. event]
func()

一切正常。

然而,问题是当被调用函数引发异常时(如上面的代码中所示),错误消息并不十分清楚。因此:

lua: test.lua:13: Hi de hi, hi de ho!
stack traceback:
    [C]: in function 'error'
    test.lua:13: in function 'func'
    test.lua:20: in main chunk

它表示"在功能' 功能'"。我更喜欢在功能中说" on_do_something '""代替。

我想象这种情况非常普遍。有解决方案吗?

我试着调用这个函数:

obj["on_" .. event]()

然后错误消息在'?'"中显示",这也没有帮助。

(我在Lua 5.1,5.2和LuaJIT上尝试了这个代码而没有明显的差异。)

2 个答案:

答案 0 :(得分:2)

这是Lua用于为函数提供名称的启发式方法的限制。

在Lua中,所有功能都是匿名的。给定函数可以是几个变量的值:全局,本地和表字段。用于错误处理的Lua调试系统试图通过查看正在执行的字节码来根据它的来源找到值的合理名称。

请参阅 Why is 'name' nil for debug.getinfo(1)

答案 1 :(得分:0)

您有几个选择。调试模块将尝试生成有用的东西。例如,如果这是您自己的代码,您可以获取定义它的文件名和行号。看到 http://www.lua.org/pil/23.1.html获取通过调试模块可用的列表。或者,您可以在模块中定义函数,然后将它们添加到表中:

-- module something
function a() 
    ...
end

tt = {
    fn1 = a, 
    ...
}

根据您捕获错误的位置(通过调试挂钩安装错误处理程序?),您可以检查filename是否是定义函数表的模块,如果是,则使用调试模块打印相应的信息根据你的表格结构等;如果不是,只需打印默认的追溯等。