Board logo

标题: OpenResty(Lua)笔记总结(1) [打印本页]

作者: look_w    时间: 2019-2-19 15:56     标题: 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




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0