返回多个值的lua函数返回错误的最佳实践

Ben*_*Ben 7 lua

我有一个lua函数,它接受多个参数并返回与参数一样多的值.每个返回值对应一个参数.为了说明,考虑一个从数据库中读取键/值对的值的函数:

val1, val2, val3 = my_function("key1", "key2", "key3");
val1 = my_function("key1");
Run Code Online (Sandbox Code Playgroud)

返回错误的最佳方法是什么my_function(例如,如果提供的"密钥"无效)

我理解一种方法是在错误nil和错误字符串上返回两个值.这是最好的方法吗?例如:

val1, val2, val3 = my_function("key1", "key2", "key3");
if val1 then
    -- Use val1, val2, and val3.
else
    print("ERROR: " .. val2);
end
Run Code Online (Sandbox Code Playgroud)

编辑

一些额外的要点:

  1. lua脚本正在使用C程序执行lua_pcall().
  2. 如果脚本失败,C程序不得中止.
  3. my_function() 用C实现
  4. my_function()出现故障时,它也应该返回指示失败原因的错误代码(或消息).

kik*_*ito 7

在Lua中抛出错误的标准方法是通过错误函数(手动,api)或通过assert(error无论如何在内部使用).

由于你的函数是在C中,你应该在其中调用lua_error,以获得相同的效果.

但请记住,您的功能现在是"不安全".如果未经修改,下面的代码会做的"抛出异常",从而阻止该程序,如果KEY1,KEY2或KEY3是"错误的"相当于:

val1, val2, val3 = my_function("key1", "key2", "key3")
Run Code Online (Sandbox Code Playgroud)

如果输入错误,有时可以让程序"崩溃".根据您的设置,用户将收到一条消息,其中包含上一个错误,堆栈跟踪或沿着这些行的内容.

如果"让程序崩溃"是不是一种选择,你可以用使用了"的try-catch"块周围的等效PCALL功能,并添加了一个名为新变量ok:

ok, val1, val2, val3 = pcall(my_function, "key1", "key2", "key3")
if ok then
  -- Use val1, val2, and val3.
else
  print("ERROR: " .. val1) -- notice that we use val1 here, not val2
end
Run Code Online (Sandbox Code Playgroud)

请注意,您不必pcall完全放在顶部my_function.与异常一样,错误恢复可能在调用链中发生更高:在函数调用中my_function,或调用该函数的函数等.例如,如果my_function从调用的函数调用parent,并从调用的函数调用父函数grandParent,则可以执行此操作:

-- parent is "insecure" since my_function is "unprotected"
function parent(key1, key2)
  local val1, val2, val3 = my_function(key1, key2, "key3")
  return val1, val2, val3
end

-- grandParent calls parent in a "safe" way
function grandParent()
  local ok, val1, val2, val3 = pcall(parent, "key1", "key2")
  if ok then
    -- Use val1, val2, and val3.
  else
    print("ERROR: " .. val1)
  end
end
Run Code Online (Sandbox Code Playgroud)