最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2014年10月29日 09:27:03   投稿:junjie  
這篇文章主要介紹了Lua極簡(jiǎn)入門指南(三): loadfile和錯(cuò)誤處理以及追蹤錯(cuò)誤等內(nèi)容,需要的朋友可以參考下

編譯

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

dofile 用于載入并執(zhí)行一個(gè) Lua 文件,相比之下,loadfile 用于載入一個(gè) Lua 文件,但并不執(zhí)行,確切的說 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è)類似 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

錯(cuò)誤

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

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

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

我們可以顯式的調(diào)用 error 函數(shù)來產(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)格來說,錯(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 來修正這個(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)用者,以此類推。

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

相關(guān)文章

  • Lua實(shí)現(xiàn)正序和倒序的文件讀取方法

    Lua實(shí)現(xiàn)正序和倒序的文件讀取方法

    這篇文章主要介紹了Lua實(shí)現(xiàn)正序和倒序的文件讀取方法,本文講解使用table生成鏈表完成正序和倒序的文件讀入功能,需要的朋友可以參考下
    2015-04-04
  • Lua協(xié)同程序coroutine的簡(jiǎn)介及優(yōu)缺點(diǎn)

    Lua協(xié)同程序coroutine的簡(jiǎn)介及優(yōu)缺點(diǎn)

    今天小編就為大家分享一篇關(guān)于Lua協(xié)同程序coroutine的簡(jiǎn)介及優(yōu)缺點(diǎn),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • Lua table的concat方法使用實(shí)例

    Lua table的concat方法使用實(shí)例

    這篇文章主要介紹了Lua table的concat方法使用實(shí)例,本文講解了concat方法的用法及使用實(shí)例,需要的朋友可以參考下
    2015-04-04
  • 詳解Lua中的變量相關(guān)知識(shí)點(diǎn)

    詳解Lua中的變量相關(guān)知識(shí)點(diǎn)

    這篇文章主要介紹了Lua中的變量相關(guān)知識(shí)點(diǎn),是Lua入門中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05
  • Lua教程(二):C++和Lua相互傳遞數(shù)據(jù)示例

    Lua教程(二):C++和Lua相互傳遞數(shù)據(jù)示例

    這篇文章主要介紹了Lua教程(二):C++和Lua相互傳遞數(shù)據(jù)示例,本文主要講解了基本數(shù)據(jù)類型的傳遞,比如整形(int)、字符串(string)、數(shù)字(number)及bool值,需要的朋友可以參考下
    2014-09-09
  • Lua中三種循環(huán)語句的使用講解

    Lua中三種循環(huán)語句的使用講解

    今天小編就為大家分享一篇關(guān)于Lua中三種循環(huán)語句的使用講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Lua中的捕獲機(jī)制和轉(zhuǎn)換技巧介紹

    Lua中的捕獲機(jī)制和轉(zhuǎn)換技巧介紹

    這篇文章主要介紹了Lua中的捕獲機(jī)制和轉(zhuǎn)換技巧介紹,捕獲是這樣一種機(jī)制:可以使用模式串的一部分匹配目標(biāo)串的一部分,將你想捕獲的模式用圓括號(hào)括起來,就指定了一個(gè)捕獲,需要的朋友可以參考下
    2014-11-11
  • lua中操作json數(shù)據(jù)的方法

    lua中操作json數(shù)據(jù)的方法

    這篇文章主要介紹了lua中操作json數(shù)據(jù)的方法,本文講解使用cjson包操作JSON數(shù)據(jù),并給出了操作實(shí)例,需要的朋友可以參考下
    2015-04-04
  • Lua腳本語言簡(jiǎn)明入門教程

    Lua腳本語言簡(jiǎn)明入門教程

    這篇文章主要介紹了Lua腳本語言簡(jiǎn)明入門教程,本文簡(jiǎn)潔干練,可以讓一個(gè)有編程基礎(chǔ)的快速的學(xué)會(huì)Lua腳本語言,需要的朋友可以參考下
    2014-09-09
  • Lua中創(chuàng)建全局變量的小技巧(禁止未預(yù)期的全局變量)

    Lua中創(chuàng)建全局變量的小技巧(禁止未預(yù)期的全局變量)

    這篇文章主要介紹了Lua中創(chuàng)建全局變量的小技巧(禁止未預(yù)期的全局變量),使用本文方法可以實(shí)現(xiàn)避免創(chuàng)建全局變量,在必須使用全局變量的情況下也給出了實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2014-12-12

最新評(píng)論

滦平县| 黎川县| 定结县| 马公市| 长宁县| 库尔勒市| 景东| 炉霍县| 嘉鱼县| 延庆县| 泰州市| 西安市| 珠海市| 嘉义市| 杭锦旗| 岳普湖县| 微山县| 黑龙江省| 滁州市| 普格县| 新干县| 剑河县| 山阴县| 南开区| 吉林省| 青岛市| 息烽县| 勃利县| 昆山市| 双辽市| 黄浦区| 定陶县| 尚义县| 时尚| 同德县| 镇坪县| 永胜县| 旬邑县| 新昌县| 建昌县| 子长县|