2013-06-04 30 views
5

Tôi đã sử dụng số LuaJSON để phân tích cú pháp JSON. Cuộc gọi phân tích cú pháp có vẻ như rằng:Làm thế nào để nắm bắt thông báo lỗi từ thư viện của bên thứ ba trong Lua?

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

Nhưng nếu json_str là xấu formated, các decode() sẽ ngừng trong LuaJSON và gián đoạn việc thực hiện file.lua. Thay vào đó, tôi muốn luồng điều khiển quay lại chức năng của mình, vì vậy tôi có thể cung cấp thông báo lỗi tùy chỉnh.

Tôi đã duyệt qua API LuaJSON và không có xử lý lỗi gọi lại như gọi lại là . Tôi muốn biết là có bất kỳ cơ chế Lua nào cho phép tôi xử lý các lỗi xảy ra bên trong LuaJSON từ bên trong file.lua?

Trả lời

9

Vấn đề ở đây là các cuộc gọi hàm decodeerror nếu gặp phải lỗi.

Đây là tương đương với cơ chế xử lý ngoại lệ của Lua. Những gì bạn muốn làm là gọi decode chức năng trong 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

Có thể, nếu thành công và độ phân giải thì sẽ chính xác hơn? –

+0

@Egor Skriptunoff Điều đó phụ thuộc vào giao diện của cuộc gọi 'giải mã '. Tôi chỉ cố gắng minh họa việc sử dụng 'pcall'. – ComicSansMS

+0

IMO, dòng 'if res == nil rồi' trong câu hỏi khá rõ ràng về tính năng này của lệnh gọi' decode'. –

0

Trong ví dụ của bạn, nếu bạn đang sử dụng phiên bản 2.1.0 CJSON, có một mới "cjson.safe" mô-đun, mà sẽ trở lại bằng không và dừng lỗi msg nếu có bất kỳ ngoại lệ nào xảy ra trong quy trình mã hóa hoặc giải mã.

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 
Các vấn đề liên quan