您好,登錄后才能下訂單哦!
程序運(yùn)行中錯(cuò)誤處理是必要的,在我們進(jìn)行文件操作,數(shù)據(jù)轉(zhuǎn)移及web service 調(diào)用過程中都會(huì)出現(xiàn)不可預(yù)期的錯(cuò)誤。如果不注重錯(cuò)誤信息的處理,就會(huì)照成信息泄露,程序無法運(yùn)行等情況。
任何程序語言中,都需要錯(cuò)誤處理。錯(cuò)誤類型有:
語法錯(cuò)誤
運(yùn)行錯(cuò)誤
=================================================================
我們可以使用兩個(gè)函數(shù):assert 和 error 來處理錯(cuò)誤。實(shí)例如下:
assert首先檢查第一個(gè)參數(shù),若沒問題,assert不做任何事情;否則,assert以第二個(gè)參數(shù)作為錯(cuò)誤信息拋出。
error (message [, level])
功能:終止正在執(zhí)行的函數(shù),并返回message的內(nèi)容作為錯(cuò)誤信息(error函數(shù)永遠(yuǎn)都不會(huì)返回)
通常情況下,error會(huì)附加一些錯(cuò)誤位置的信息到message頭部。
Level參數(shù)指示獲得錯(cuò)誤的位置:
Level=1[默認(rèn)]:為調(diào)用error位置(文件+行號(hào))
Level=2:指出哪個(gè)調(diào)用error的函數(shù)的函數(shù)
Level=0:不添加錯(cuò)誤位置信息
Lua中處理錯(cuò)誤,可以使用函數(shù)pcall(protected call)來包裝需要執(zhí)行的代碼。
pcall接收一個(gè)函數(shù)和要傳遞個(gè)后者的參數(shù),并執(zhí)行,執(zhí)行結(jié)果:有錯(cuò)誤、無錯(cuò)誤;返回值true或者或false, errorinfo。
語法格式如下
if pcall(function_name, ….) then-- 沒有錯(cuò)誤else-- 一些錯(cuò)誤end
pcall以一種"保護(hù)模式"來調(diào)用第一個(gè)參數(shù),因此pcall可以捕獲函數(shù)執(zhí)行中的任何錯(cuò)誤。
通常在錯(cuò)誤發(fā)生時(shí),希望落得更多的調(diào)試信息,而不只是發(fā)生錯(cuò)誤的位置。但pcall返回時(shí),它已經(jīng)銷毀了調(diào)用桟的部分內(nèi)容。
Lua提供了xpcall函數(shù),xpcall接收第二個(gè)參數(shù)——一個(gè)錯(cuò)誤處理函數(shù),當(dāng)錯(cuò)誤發(fā)生時(shí),Lua會(huì)在調(diào)用桟展看(unwind)前調(diào)用錯(cuò)誤處理函數(shù),于是就可以在這個(gè)函數(shù)中使用debug庫來獲取關(guān)于錯(cuò)誤的額外信息了。
debug庫提供了兩個(gè)通用的錯(cuò)誤處理函數(shù):
debug.debug:提供一個(gè)Lua提示符,讓用戶來價(jià)差錯(cuò)誤的原因
debug.traceback:根據(jù)調(diào)用桟來構(gòu)建一個(gè)擴(kuò)展的錯(cuò)誤消息
>=xpcall(function(i) print(i) error('error..') end, function() print(debug.traceback()) end, 33) 33 stack traceback: stdin:1: in function '' 123''
function myfunction() n = n/nil end function myerrhandler(err) print("ERROR", err) end status = xpcall(myfunction, myerrhandler) print(status)
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。