Lua之异常捕获

如果需要在 Lua 中处理错误,必须使用函数 pcall(protected call)来包装需要执行的代码。 pcall 接收一个函数和要传递给后者的参数,并执行,执行结果:有错误、无错误;返回值 true 或者或 false, errorinfo。

pcall本质上是使用“保护模式”来运行第一参数,因此可以捕获运行过程中的错误。

给一个Cjson的例子:

local json = require("cjson")
local str  = [[ {"key:"value"} ]]

local t    = json.decode(str)
ngx.say(" --> ", type(t))

可以看到,需要解析的str是不完整的,缺少一个",如果运行,将直接返回500内部错误。这显然不是我们想看到的。为了捕获这个问题,我们将decode封装一层,然后使用pcall来调用。

local json = require("cjson")
local str  = [[ {"key:"value"} ]]

function _json_decode(str)
    return json.decode(str)
end

function json_decode(str)
    local ok, t = pcall(_json_decode, str)
    if not ok then
        return nil    
    else
        return t
    end
end

local t = json_decode(str)

ngx.say(" --> ", type(t))

我们将json.decode封装起来,并使用pcall函数来调用,同样传入错误的字符串,函数会判断实行有异常,然后返回nil。这样我们就有了处理异常的机制。