我有一个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)
编辑
一些额外的要点:
lua_pcall()
.my_function()
用C实现my_function()
出现故障时,它也应该返回指示失败原因的错误代码(或消息).在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)