我有一个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
修改
其他一些要点:
lua_pcall()
在C程序中执行lua脚本。my_function()
在C。my_function()
失败时,它还应返回错误代码(或消息),指出失败的原因。答案 0 :(得分:7)
在Lua中抛出错误的标准方法是通过错误函数(manual,api)或通过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
无效键是最好的方法。