lua技巧分享之保護執行

2022-03-21 00:13:13 字數 1200 閱讀 7194

我們在c#/c++裡為了防止呼叫出現異常的時候程式可以正常的執行,經常使用try{}catch{}的結構,

那麼,語言簡單的lua是怎麼做到的呢?答案就在pcall

先簡單的介紹一下這個函式:

--嘗試將乙個字串加上整數,肯定是error的

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

用人話來說就是:傳不帶引數的函式指標他幫你執行,返回兩個引數,第乙個是執行狀態,成功返回true,有錯誤返回false,並且錯誤描述

注意了,這個函式是不帶引數的,如果需要傳送引數給你需要呼叫的函式,你只能選擇閉包或者說是匿名函式了

function

make_err(c)

assert

(c)end

local status, err = pcall(function () make_err(1) end

)print(status, err)

如果我的執行過程中需要看到呼叫的堆疊怎麼辦呢?

答案就在:debug.traceback()

完整**如下:

function

a(s)

return b(s) .. 'a'

endfunction

b(s)

return c(s) .. 'b'

endfunction

c(s)

ifnot s then

print(debug.traceback

())

error('

不可以是nile拉')

endreturn s .. 'c'

end--

print(debug.traceback())

local status, err = pcall(function

() a(

nil)

end)

Redis指令碼外掛程式之 執行Lua指令碼示例

redis在2.6推出了指令碼功能,允許開發者使用lua語言編寫指令碼傳到redis中執行。使用指令碼的好處如下 在redis客戶端機器上,新建乙個檔案ratelimiting.lua,內容如下 local times redis.call incr keys 1 if times 1 then r...

SEO細節經驗技巧分享之站內更新

做seo最重要的是什麼?個人覺得有三點比較重要 思維 細節 堅持。思維的問題不好講,堅持的問題講了也沒什麼用,那我就和大家分享下我個人在做seo的時候一些細節經驗技巧吧,這篇文章裡我來講講站內更新的問題。關於標題與描述 關於標題我想說的很少,要麼以長尾關鍵詞為標題去寫,要麼想一些具有新意,讓使用者產...

程式設計技巧分享之so的初始化

假設我們需要提供乙個 so 給其他人用,並這個 so 需要執行初始化動作,你會怎麼來設計?這種方法應該是最容易想到到的,直接簡單粗暴,提供介面,讓呼叫者來處理,示例如下 method1.c void method1 init void void method1 dosomething void ma...