【问题标题】:Lua fix attempt to index a NIL fieldLua 修复尝试索引 NIL 字段
【发布时间】:2020-04-06 13:32:56
【问题描述】:

我已经搜索了答案,这应该很简单,但我找不到解决方案。

我正在尝试从从太阳能逆变器获得的 json 对象中索引数据。

当逆变器运行时,PAC 字段包含我想要的 POWER AC 值。当太阳落山时,该字段不会下降到 0,它会从 API 响应中完全消失,因此我的代码会在尝试索引不存在的字段时抛出错误。

当该字段不存在时,如何捕获此错误并返回 0?

PAC = resp1.Body.Data.PAC.Value

我试过了:

PAC = resp1.Body.Data.PAC.Value or 0

但这不起作用。

【问题讨论】:

    标签: api lua


    【解决方案1】:

    如果 PAC = resp1.Body.Data.PAC.Value 导致索引 nil 值时出错,PAC = resp1.Body.Data.PAC.Value or 0 将导致相同的错误,因为您仍然索引相同的 nil 值。

    我只能猜测resp1.Body.Data.PAC 为零。

    然后类似

    PAC = resp1.Body.Data.PAC and resp1.Body.Data.PAC.Value or 0
    

    会起作用的。

    这基本上相当于

    if not reps1.Body.Data.PAC then
      PAC = 0
    else
      PAC = resp1.Body.Data.PAC.Value
    end
    

    或者

    if reps1.Body.Data.PAC then
      PAC = resp1.Body.Data.PAC.Value
    else
      PAC = 0
    end
    

    这样可以避免索引resp1.Body.Data.PAC,如果它是nil

    你应该知道究竟什么是 nil。

    【讨论】:

    • 除非我特别引用 PAC.value,否则我无法从 PAC 获取值。
    【解决方案2】:

    我知道这很容易,但我觉得很傻。

    我能够在 pcall 中捕获错误。

    pcall(function() PAC = resp1.Body.Data.PAC.Value end)
    if PAC then
      ...
    end
    

    【讨论】:

    • 而不是通过索引一个 nil 值来强制引发错误,而不是捕获它,你应该首先避免索引它
    • 当它是一个关键字段时如何避免索引它?在尝试对其进行索引之前,我似乎无法找到“测试”该字段是否存在的方法?
    • 您可以使用 if 语句或使用逻辑运算符对其进行测试。看我的回答。
    • 首先感谢您花时间帮助我。现在我已经尝试过这样做,但它仍然从 if 调用中抛出了相同的错误。 PAC 表有 4 个元素,'unit' constant = 'wh' 和 'value' 具有我想要的整数值。但是,当该字段降至“0”时,整个 PAC 表将从 API 调用给出的 json 对象响应中消失。当 PAC 表在 json 调用中不存在时,即使使用 IF 语句也会引发错误。
    • resp1.Body.Data.PAC.Value 是一个索引操作链。找出它们中的哪一个导致错误。什么是零? resp1? resp1.Body? resp1.Body.Data? resp1.Body.Data.PAC?`
    猜你喜欢
    • 2019-03-01
    • 2011-11-05
    • 1970-01-01
    • 2014-04-04
    • 2019-08-21
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    相关资源
    最近更新 更多