json 解 析 的 异 常 捕 获
local cjson = require "cjson"
local json_str = [[{"name":"ybl}]]
local tab = cjson.decode(json_str)
ngx.say(type(tab))
代码执行错误日志如下:
2016/12/11 11:51:58 [error] 8364#0: *2810371 lua entry thread aborted: runtime error: /web/lua/cc2_demo.lua:167: Expected value but found unexpected end of string at character 14
stack traceback:
coroutine 0:
[C]: in function 'decode'
/web/lua/cc2_demo.lua:167: in function , client: 127.0.0.1, server: localhost, request: "GET /demo HTTP/1.1", host: "127.0.0.1"
如果需要在Lua中处理错误,必须使用函数pcall(protected call)来包装需要执行的代码。pcall接收一个函数和要传递给后者的参数,并执行,执行结果:有错误、无错误;返回值true或者或false, errorinfo。pcall以一种"保护模式"来调用第一个参数,因此pcall可以捕获函数执行中的任何错误。
所以改良一下代码如下
function json_decode( str )
local cjson = require "cjson"
local json_value = nil
pcall(function (str) json_value = cjson.decode(str) end, str)
return json_value
end
local json_str_1 = [[{"name":"ybl}]]
local json_str_2 = [[{"name":"ybl"}]]
local tab1 = json_decode(json_str_1)
local tab2 = json_decode(json_str_2)
ngx.say(type(tab1))
ngx.say(type(tab2))
运行结果:nil 和 table |