首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

OpenResty(Lua)笔记总结(1)

OpenResty(Lua)笔记总结(1)

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
返回列表