2013-06-04 4 views
5

Ich habe die LuaJSON angenommen, um JSON zu parsen. Der Parse-Aufruf scheint wie folgt aus:Wie erhalte ich eine Fehlermeldung von der Third-Party-Library in Lua?

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

Aber wenn die json_str schlecht formatiert ist, wird die decode() innerhalb LuaJSON zu stoppen und unterbrechen die Ausführung von file.lua. Ich möchte, dass der Kontrollfluss stattdessen zu meiner Funktion zurückkehrt, sodass ich eine benutzerdefinierte Fehlerbenachrichtigung bereitstellen kann.

Ich habe die LuaJSON-APIs durchsucht, und es gibt keine Rückruf-ähnliche Fehlerbehandlung. Ich möchte wissen, gibt es einen Lua-Mechanismus, der es mir erlaubt, Fehler innerhalb von LuaJSON innerhalb von file.lua zu behandeln?

Antwort

9

Das Problem hier ist, dass die decode Funktion error aufruft, wenn es einen Fehler findet.

Dies ist Lua entspricht einem Ausnahmebehandlungsmechanismus. Was Sie tun möchten, ist rufen die decode Funktion 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 
+1

Wahrscheinlich, 'wenn Erfolg und res dann 'wäre richtiger? –

+0

@Egor Skriptunoff Das hängt von der Schnittstelle des 'decode' Aufrufes ab. Ich habe nur versucht, die Verwendung von 'pcall' zu veranschaulichen. – ComicSansMS

+0

IMO, die Zeile 'if res == nil then' in der Frage ist ziemlich klar über diese Funktion von 'decode' Aufruf. –

0

In Ihrem Beispiel, wenn Sie mit CJSON Version 2.1.0, gibt es ein neues „cjson.safe“ -Modul, das Null zurück und Fehler msg wenn eine Ausnahme in der Kodierungs- oder Dekodierprozedur aufgetreten ist.

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 
Verwandte Themen