lua技巧分享之保護執行

冷侃發表於2015-07-25

我們在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)

 

相關文章