校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁(yè) > 知識(shí)庫(kù) > Lua極簡(jiǎn)入門(mén)指南(三): loadfile和錯(cuò)誤處理

Lua極簡(jiǎn)入門(mén)指南(三): loadfile和錯(cuò)誤處理

熱門(mén)標(biāo)簽:武漢外呼防封系統(tǒng)多少錢(qián) 清朝地圖標(biāo)注哈爾濱 漳州智云呼電話機(jī)器人 怎么去除地圖標(biāo)注 新岸線智能電銷(xiāo)機(jī)器人 個(gè)人怎么在地圖標(biāo)注需要的店鋪 百度地圖標(biāo)注早餐區(qū)域 地圖標(biāo)注大廈 冀州市地圖標(biāo)注

編譯

Lua 雖然是解釋性語(yǔ)言,但 Lua 源碼總是被編譯為中間形式后再執(zhí)行。

dofile 用于載入并執(zhí)行一個(gè) Lua 文件,相比之下,loadfile 用于載入一個(gè) Lua 文件,但并不執(zhí)行,確切的說(shuō) loadfile 編譯了一個(gè) chunk,并返回此被編譯的 chunk(被作為一個(gè)函數(shù)):

復(fù)制代碼 代碼如下:

c = loadfile('./test.lua')
c()

dofile 可以被實(shí)現(xiàn)為:

復(fù)制代碼 代碼如下:

function dofile(filename)
    local f = assert(loadfile(filename))
    return f()
end

一個(gè)類(lèi)似 loadfile 的函數(shù) load,它使用字符串(而非文件)作為參數(shù),返回被編譯的 chunk:

復(fù)制代碼 代碼如下:

f = load('i = i + 1')
i = 0
f(); print(i)  --> 1
f(); print(i)  --> 2

另外,我們可以使用命令 luac 來(lái)直接編譯 Lua 文件:

復(fù)制代碼 代碼如下:

luac -o prog.lc prog.lua
lua prog.lc

錯(cuò)誤

Lua 遇見(jiàn)任何不可接受的條件時(shí)會(huì)產(chǎn)生錯(cuò)誤。例如:

復(fù)制代碼 代碼如下:

local t = {}
-- 出錯(cuò)
t = t + 1

我們可以顯式的調(diào)用 error 函數(shù)來(lái)產(chǎn)生一個(gè)錯(cuò)誤,error 接受一個(gè)錯(cuò)誤消息作為參數(shù):

復(fù)制代碼 代碼如下:

print 'enter a number:'
n = io.read('*n')
if not n then error('invalid input') end

assert 函數(shù)也可以產(chǎn)生錯(cuò)誤。assert 函數(shù)檢查第一個(gè)參數(shù)是否為 false,如果不為 false 就返回此參數(shù),如果為 false 就產(chǎn)生一個(gè)錯(cuò)誤。assert 的第二個(gè)參數(shù),錯(cuò)誤消息,是可選的。范例:

復(fù)制代碼 代碼如下:

n = io.read()
assert(tonumber(n), 'invalid input: ' .. n .. ' is not a number')

pcall 函數(shù)可以捕獲錯(cuò)誤:
復(fù)制代碼 代碼如下:

local ok, msg = pcall(function()
    assert(false)
end)
 
print(ok, msg)

pcall 函數(shù)使用保護(hù)模式(protected mode)調(diào)用第一個(gè)參數(shù)(此參數(shù)為一個(gè)函數(shù)),如果被調(diào)用的函數(shù)執(zhí)行不存在錯(cuò)誤,pcall 返回 true 并返回被調(diào)用函數(shù)的所有返回值,如果被調(diào)用的函數(shù)產(chǎn)生了錯(cuò)誤,pcall 返回 false 并附帶上錯(cuò)誤消息。嚴(yán)格來(lái)說(shuō),錯(cuò)誤消息不一定需要是字符串:

復(fù)制代碼 代碼如下:

local ok, err = pcall(function()
    error({code = 502})
end)
 
print(err.code)

追蹤錯(cuò)誤

我們先看一個(gè)函數(shù):

復(fù)制代碼 代碼如下:

function foo(str)
    if type(str) ~= 'string' then
        error('string expected')
    end
    -- ...
end
 
foo(1)

foo 函數(shù)需要一個(gè)字符串參數(shù),我們執(zhí)行上面的代碼:

復(fù)制代碼 代碼如下:

lua: test.lua:3: string expected

輸出指出了錯(cuò)誤出現(xiàn)在 foo 函數(shù)中(因?yàn)?foo 函數(shù)調(diào)用了 error),而實(shí)際上,錯(cuò)誤是 foo 的調(diào)用者產(chǎn)生的,而非 foo 產(chǎn)生的。我們可以設(shè)置 level 來(lái)修正這個(gè)報(bào)錯(cuò):

復(fù)制代碼 代碼如下:

function foo(str)
    if type(str) ~= 'string' then
        error('string expected', 2)
    end
    -- ...
end

error 函數(shù)的第二個(gè)參數(shù)為 level,用于指定報(bào)錯(cuò)的位置,level 值為 1 表示 error 的調(diào)用者,值為 2 表示 error 的調(diào)用者的調(diào)用者,以此類(lèi)推。

pcall 只能返回錯(cuò)誤消息,很多時(shí)候我們需要完整的調(diào)用棧,這時(shí)可以使用 xpcall 函數(shù)。xpcall 函數(shù)可以接收一個(gè)消息 handler 作為參數(shù),在被調(diào)用函數(shù)出現(xiàn)錯(cuò)誤時(shí),消息 handler 會(huì)被調(diào)用,通過(guò)其就可以獲取到當(dāng)前調(diào)用棧的信息。

您可能感興趣的文章:
  • Lua腳本語(yǔ)言簡(jiǎn)明入門(mén)教程
  • Lua極簡(jiǎn)入門(mén)指南(一):基礎(chǔ)知識(shí)篇
  • Lua極簡(jiǎn)入門(mén)指南(一):函數(shù)篇
  • Lua極簡(jiǎn)入門(mén)指南:全局變量
  • lua腳本語(yǔ)言快速入門(mén)教程
  • Lua入門(mén)學(xué)習(xí)筆記
  • Lua極簡(jiǎn)入門(mén)指南(六):模塊
  • Lua 極簡(jiǎn)入門(mén)指南(七):面向?qū)ο缶幊?/li>
  • Lua腳本語(yǔ)言基本語(yǔ)法快速入門(mén)教程
  • Lua語(yǔ)言新手簡(jiǎn)單入門(mén)教程

標(biāo)簽:德宏 宣城 濰坊 金昌 天門(mén) 儋州 臺(tái)灣 天門(mén)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Lua極簡(jiǎn)入門(mén)指南(三): loadfile和錯(cuò)誤處理》,本文關(guān)鍵詞  Lua,極簡(jiǎn),入門(mén),指南,三,loadfile,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Lua極簡(jiǎn)入門(mén)指南(三): loadfile和錯(cuò)誤處理》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于Lua極簡(jiǎn)入門(mén)指南(三): loadfile和錯(cuò)誤處理的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 微山县| 偏关县| 敦化市| 修武县| 治多县| 若羌县| 青神县| 肥西县| 武夷山市| 平利县| 赤壁市| 礼泉县| 德惠市| 新宁县| 南陵县| 祁阳县| 衡山县| 鄂伦春自治旗| 郎溪县| 安阳市| 龙海市| 南陵县| 延津县| 新乡市| 林芝县| 炎陵县| 宾阳县| 阜康市| 右玉县| 南澳县| 渝中区| 淮安市| 通州市| 东安县| 磐安县| 济宁市| 保康县| 龙门县| 江津市| 新竹县| 定襄县|