2013-11-27 29 views
2

假設我通過變量間接調用一些函數。例如:如何在錯誤消息中顯示正確的函數名稱?

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 

它說: 「在功能上 'FUNC'」。我寧願它說「在功能'on_do_something'」,而不是。

我想像這種情況是很常見的。有沒有解決方案?

我打過電話的功能這樣的:

obj["on_" .. event]() 

但隨後的錯誤消息說,「在功能‘?’」,這是沒有幫助的任何。

(我想上的Lua 5.1,5.2和LuaJIT這個代碼,無需顯着的差異。)

回答

0

您有幾種選擇。調試模塊將嘗試產生一些有用的東西。例如,如果這是您自己的代碼,您可能可以獲取文件名和行號。請參閱 http://www.lua.org/pil/23.1.html瞭解可通過調試模塊獲取的內容列表。或者,你也許可以在模塊中定義的功能,然後將它們添加到表:

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

tt = { 
    fn1 = a, 
    ... 
} 

根據你的陷阱(?通過調試鉤安裝錯誤處理程序)的錯誤,你可以檢查文件名是定義函數表的模塊,如果是,則使用調試模塊根據表結構等打印適當的信息;如果不是,只是打印默認回溯等

+0

感謝您試圖想出一些解決方案。 –

2

這是Lua中用於提供的功能的名稱的試探法的限制。

在Lua中,所有的功能都是匿名的。一個給定的函數可以是幾個變量的值:全局,局部和表格字段。在錯誤處理中使用的Lua調試系統試圖通過查看正在執行的字節碼來根據它的來源找到合理的值。

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

+0

我明白了。所以我想這個問題應該被標記爲「重複」。我可以想象解決這個問題的一個竅門是評估一個包含實際函數名稱的sting('loadstring')。但這不是非常有效。任何人都可以想到其他一些技巧嗎? –

+0

思考夫妻可行的解決方案。其中一個可能會使用一些metaLua巫術:每次創建閉包時添加一些調試信息。 – Kamiccolo