如果需要在 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。这样我们就有了处理异常的机制。