我們在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' end function b(s) return c(s) .. ' b' end function c(s) if not s then print(debug.traceback()) error('不可以是nile拉') end return s .. ' c' end --print(debug.traceback()) local status, err = pcall(function () a(nil) end)