麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發(fā) > 綜合 > 正文

Lua極簡入門指南(三): loadfile和錯誤處理

2024-07-21 23:04:16
字體:
供稿:網(wǎng)友

編譯

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

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

 

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

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

 

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

 

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

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

 

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

 

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

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

 

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

 

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

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

 

錯誤

Lua 遇見任何不可接受的條件時會產(chǎn)生錯誤。例如:

 

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

local t = {}
-- 出錯
t = t + 1

 

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

 

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

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

 

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

 

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

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

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

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

 

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

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

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

 

追蹤錯誤

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

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

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

 

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

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

lua: test.lua:3: string expected

 

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

 

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

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

 

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

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产精品久久久久免费视频 | 黄色片网站免费 | 国产精品成人久久 | 麻豆视频在线免费观看 | 日韩av成人 | www.99久久久 | 国产女厕一区二区三区在线视 | 国产1区2区3区中文字幕 | 国产成人在线观看免费网站 | 国产午夜精品一区二区三区四区 | 日韩999| 素人视频在线观看免费 | 一级毛片在线看 | 精品一区二区电影 | 国产精品久久久免费 | 欧美精品成人一区二区三区四区 | www国产网站 | 国产精品亚洲欧美一级在线 | 黄色网址免费在线 | 亚洲精品 在线播放 | 欧美成人性色 | 国产精品久久久久久影视 | 久草在线播放视频 | 性少妇freeseⅹbbwhd | 国产精品久久久久一区二区 | 国产精品99久久久久久久 | 久久精品国产99久久久古代 | 欧美hdfree性xxxx| 国产精品一区二区三区在线 | av懂色| 99国产精品自拍 | 日本爽快片100色毛片视频 | 亚洲草逼视频 | 在线 日本 制服 中文 欧美 | 蜜桃网站免费 | 国产91亚洲精品一区二区三区 | 精品无码久久久久久国产 | 国产精品视频成人 | av电影在线观看免费 | 国产精品成人一区二区三区电影毛片 | 久久在线精品视频 |