lua如何打印行号_LUA教程错误信息和回跟踪(Tracebacks)-34
雖然你可以使用任何類(lèi)型的值作為錯(cuò)誤信息,通常情況下,我們使用字符串來(lái)描述遇到的錯(cuò)誤。如果遇到內(nèi)部錯(cuò)誤(比如對(duì)一個(gè)非table的值使用索引下標(biāo)訪問(wèn))Lua將自己產(chǎn)生錯(cuò)誤信息,否則Lua使用傳遞給error函數(shù)的參數(shù)作為錯(cuò)誤信息。不管在什么情況下,Lua都盡可能清楚的描述問(wèn)題發(fā)生的緣由。
local status, err = pcall(function () a = 'a'+1 end)
print(err)
--> stdin:1: attempt to perform arithmetic on a string value
local status, err = pcall(function () error("my error") end)
print(err)
--> stdin:1: my error
例子中錯(cuò)誤信息給出了文件名(stdin)與行號(hào)。
函數(shù)error還可以有第二個(gè)參數(shù),表示錯(cuò)誤發(fā)生的層級(jí)。比如,你寫(xiě)了一個(gè)函數(shù)用來(lái)檢查“error是否被正確調(diào)用”:
function foo (str)
if type(str) ~= "string" then
error("string expected")
end
...
end
可有人這樣調(diào)用此函數(shù):
foo({x=1})
Lua會(huì)指出發(fā)生錯(cuò)誤的是foo而不是error,實(shí)際上,錯(cuò)誤是調(diào)用error時(shí)產(chǎn)生的。為了糾正這個(gè)問(wèn)題,修改前面的代碼讓error報(bào)告錯(cuò)誤發(fā)生在第二級(jí)(你自己的函數(shù)是第一級(jí))如下:
function foo (str)
if type(str) ~= "string" then
error("string expected", 2)
end
...
end
當(dāng)錯(cuò)誤發(fā)生的時(shí)候,我們常常希望了解詳細(xì)的信息,而不僅是錯(cuò)誤發(fā)生的位置。若能了解到“錯(cuò)誤發(fā)生時(shí)的棧信息”就好了,但pcall返回錯(cuò)誤信息時(shí),已經(jīng)釋放了保存錯(cuò)誤發(fā)生情況的棧信息。因此,若想得到tracebacks,我們必須在pcall返回以前獲取。Lua提供了xpcall來(lái)實(shí)現(xiàn)這個(gè)功能,xpcall接受兩個(gè)參數(shù):調(diào)用函數(shù)、錯(cuò)誤處理函數(shù)。當(dāng)錯(cuò)誤發(fā)生時(shí),Lua會(huì)在棧釋放以前調(diào)用錯(cuò)誤處理函數(shù),因此可以使用debug庫(kù)收集錯(cuò)誤相關(guān)信息。有兩個(gè)常用的debug處理函數(shù):debug.debug和debug.traceback,前者給出Lua的提示符,你可以自己動(dòng)手察看錯(cuò)誤發(fā)生時(shí)的情況;后者通過(guò)traceback創(chuàng)建更多的錯(cuò)誤信息,也是控制臺(tái)解釋器用來(lái)構(gòu)建錯(cuò)誤信息的函數(shù)。你可以在任何時(shí)候調(diào)用debug.traceback獲取當(dāng)前運(yùn)行的traceback信息:
print(debug.traceback())
總結(jié)
以上是生活随笔為你收集整理的lua如何打印行号_LUA教程错误信息和回跟踪(Tracebacks)-34的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java final 关键字简述
- 下一篇: tensorflow 启动多个sessi