2016-08-24 132 views
2

我試圖改進運行Lua腳本的程序中的錯誤處理。 簡化版: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'例如?

回答

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 
3

[string ""]來自您加載塊到vm的方式。你沒有提供文件名作爲lua_dofile/lua_loadfile/lua_dostring/lua_loadstring的參數,或者只給了空字符串。
並注意字符串是lua文件(lua chunk)的名稱,而不是函數的名稱。