如何从Lua中的第三方库中捕获错误消息?

时间:2013-06-04 08:00:12

标签: json lua ierrorhandler

我已采用LuaJSON来解析JSON。解析调用似乎是这样的:

-- file.lua
local res = json.decode.decode(json_str)
if res == nil then
    throw('invalid JSON')
end
...

但如果json_str格式不正确,decode()将在LuaJSON内停止并中断 file.lua 的执行。我希望控制流改为返回我的函数,因此我可以提供自定义错误通知。

我浏览过LuaJSON API,并且没有类似回调的错误处理。我想知道是否有任何Lua机制允许我处理 file.lua 中LuaJSON内发生的错误?

2 个答案:

答案 0 :(得分:9)

这里的问题是decode函数遇到错误时会调用error

这是Lua等同于异常处理机制。您要执行的操作是调用protected mode中的decode功能:

local success, res = pcall(json.decode.decode, json_str);
if success then
    -- res contains a valid json object
    ...
else
    -- res contains the error message
    ...
end

答案 1 :(得分:0)

在您的示例中,如果您使用的是CJSON版本2.1.0,则会有一个新的“cjson.safe”模块,如果在编码或解码过程中发生任何异常,它将返回nil和错误消息。

local decoder = require("cjson.safe").decode
local decoded_data, err = decoder(data)
if err then
    ngx.log(ngx.ERR, "Invalid request payload:", data)
    ngx.exit(400)
end