How to capture error message from third-party-library in Lua?
Asked Answered
D

2

9

I have adopted the LuaJSON to parse JSON. The parse call seems like that:

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

But if the json_str is badly formated, the decode() will stop within LuaJSON and interrupt the execution of file.lua. I want the control flow to return to my function instead, so I can provide a custom error notification.

I have browsed the LuaJSON APIs, and there is no callback-like error handling. I want to know is there any Lua mechanism that allows me to handle errors occuring within LuaJSON from within file.lua?

Ditter answered 4/6, 2013 at 8:0 Comment(0)
O
10

The problem here is that the decode function calls error if it encounters an error.

This is Lua's equivalent to an exception handling mechanism. What you want to do is call the decode function in protected mode:

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
Obliquity answered 4/6, 2013 at 8:53 Comment(3)
@Egor Skriptunoff That depends on the interface of the decode call. I was just trying to illustrate the use of pcall.Obliquity
IMO, the line if res == nil then in the question is pretty clear about this feature of decode call.Fusspot
@Egor Skriptunoff Yes, but that code assumed decode to return normally in the failure case (i.e. not via a longjmp triggered by error), which clearly it does not.Obliquity
T
4

In your example, if you are using CJSON version 2.1.0, there is a new "cjson.safe" module, which will return nil and error msg if any exception occurred in encode or decode procedure.

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
Topsail answered 26/9, 2017 at 10:8 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.