gpt4 book ai didi

error-handling - 使用 lua 的 error(.., level) 是一种反模式吗?

转载 作者:行者123 更新时间:2023-12-03 07:38:19 25 4
gpt4 key购买 nike

Lua 5.1 的 API 提供了 error()函数,它接受一个字符串(错误消息)和一个“级别”。
我的理解是level , 允许您向上移动调用堆栈,因此您可以提供更好的错误报告,尤其是在将模块作为 API 交付时。
例如,假设用户调用 api_function(x)x = nil .这将是一个错误,但 API 直到它的代码相当多才知道。
它可能会导致这个调用堆栈:

api_function(x)                     : user_file.lua:30
-> api_function : api.lua:20
-> some_function : api.lua:250
-> handle_when_x_string : api_string.lua:20
-> error("value is nil") : api_string.lua:66
如所写,用户将看到类似 api_string.lua:66 error: value is nil 的内容。 ,当他们真正想看到“nice”错误时, user_file.lua:30 error: value is nil . (“这个错误是我的错还是 API 中的错误?”)
现在,我们可以将代码更改为“弹出调用堆栈”,
api_function(x)                     : user_file.lua:30
-> api_function : api.lua:20
-> some_function : api.lua:250
-> handle_when_x_string : api_string.lua:20
-> error("value is nil", 5) : api_string.lua:66
这将返回“nice”错误,但是,假设您也可以调用 handle_when_x_string更直接(撇开糟糕的 API 设计不谈),
another_api_fn(x)                     : user_file.lua:44
-> another_api_fn : api.lua:11
-> handle_when_x_string : api_string.lua:20
-> error("value is nil", 5) : api_string.lua:66
现在我们的“流行级别”是不正确的。也许在这个例子中,它会简单地弹出到顶部并停止尝试,但是“错误级别”的原则至少仍然令人不舒服,它甚至可能会从用户导致错误的地方弹出。
我可以看到一些解决方案:
  • 不要设置级别,只是假设用户足够聪明,可以解决问题。
  • 在 pcall 中包装 api 入口点 ( api_functionanother_api_fn ) 以下的任何内容,捕获任何错误并使用已知的“良好”级别值重新冒泡。
  • 永远不要在较低的 api 函数中出错,总是 return nil, error或一些类似的模式,然后在 api_function 中检查并按要求行事。

  • 我的问题是:
  • 返回错误的级别是否有问题?只是“是的,随便”一个数字似乎很糟糕,希望它是好的。
  • 如果这是一个问题,什么时候设置级别是一个好习惯(可能超过 0 会禁用位置报告)
  • 如果有的话,哪些解决方案是最佳实践?我应该怎么做才能写出更好的可维护代码?包装在 pcall 中似乎是最简单的,因为在测试时您仍然可以依赖“正常错误”,并且您的功能有些简单,但不知何故,在我的脑海中感觉像是一种反模式。
  • 最佳答案

    首先,您需要区分由于错误的 API 调用导致的错误以及代码中的实际错误。
    如果error的目的| call 是告诉 API 用户他们传递了错误的参数,你应该验证每个 API 函数中的参数,以便知道错误级别,这样你的库的其余部分就知道它正在使用有效的参数。如果您最终得到一个复杂的验证函数层次结构,它们可以采用函数名称和错误级别的参数。这是一个非常人为的示例,说明如何使用错误级别:

    local function lessThan100(x, funcName, errorLevel)
    if x >=100 then
    error(funcName .. ' needs a number less than 100', errorLevel)
    end
    end

    local function numLessThan100(x, funcName, errorLevel)
    if type(x) ~= 'number' then
    error(funcName .. ' needs a number', errorLevel)
    end
    lessThan100(x, funcName, errorLevel + 1)
    end

    -- API function
    local function printNum(x)
    numLessThan100(x, 'printNum', 3)
    print(x)
    end
    如果 error call 表示代码中的错误,然后不要使用级别,因为您无法知道是什么触发了错误。

    关于error-handling - 使用 lua 的 error(.., level) 是一种反模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64871447/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com