我們在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,並且錯誤描述
注意了,這個函式是不帶引數的,如果需要傳送引數給你需要呼叫的函式,你只能選擇閉包或者說是匿名函式了
functionmake_err(c)
assert
(c)end
local status, err = pcall(function () make_err(1) end
)print(status, err)
如果我的執行過程中需要看到呼叫的堆疊怎麼辦呢?
答案就在:debug.traceback()
完整**如下:
functiona(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...