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

时间:2012-01-06 03:01:10

标签: lua

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

val1, val2, val3 = my_function("key1", "key2", "key3");
val1 = my_function("key1");

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

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

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

修改

其他一些要点:

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

2 个答案:

答案 0 :(得分:7)

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

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

但请记住,您的功能现在是“不安全”。如果未修改,以下代码将执行相当于“抛出异常”并因此暂停程序,如果key1,key2或key3是“错误的”:

val1, val2, val3 = my_function("key1", "key2", "key3")

如果输入错误,有时可以让程序“崩溃”。根据您的设置,用户将收到一条消息,其中包含最后一个错误,一个堆栈跟踪或其他内容。

如果“让程序崩溃”不是一个选项,你可以使用pcall函数和“{3}”函数添加一个名为{{1 }}:

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 完全置于pcall之上。与异常一样,错误恢复可能在调用链中发生更高:在调用my_function的函数中,或调用该函数的函数等。例如,如果从名为{的函数调用my_function {1}}和来自名为my_function的父级,您可以这样做:

parent

答案 1 :(得分:0)

通常的做法是在程序无法恢复时丢失错误(例如,文件句柄错误),并在可以恢复时发出错误信号(例如找不到文件)。在您的情况下,我认为只返回nil无效键是最好的方法。