从 Lua 函数返回多个值时,如何最佳地返回错误。
2012-1-8 23:10:57
收藏:0
阅读:228
评论:2
我有一个 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
-- 使用 val1,val2 和 val3。
else
print("ERROR: " .. val2);
end
编辑
一些附加要点:
- 这个 Lua 脚本是使用
lua_pcall()
从 C 程序中执行的。 - 如果脚本失败,则 C 程序不能中止。
my_function()
是在 C 中实现的。- 当
my_function()
失败时,它也应该返回错误代码(或消息)表明失败的原因。
原文链接 https://stackoverflow.com/questions/8752855
点赞
stackoverflow用户107090
通常的做法是当程序无法恢复(例如,错误的文件句柄)时抛出错误,当它可以恢复(例如,找不到文件)时发出信号。在你的情况下,我认为对于无效的键,简单地返回 nil
是最好的方法。
The usual practice is to throw errors when the program cannot recover (bad file handle for instance) and signal errors when it can recover (file not found for instance). In your case, I think that simply returning `nil` for invalid keys is the best way.
2012-01-06 10:59:33
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
Lua中抛出错误的标准方式是通过 error 函数(manual, api) 或者通过 assert (其内部也是使用
error
)。因为你的函数是C函数,所以你应该在函数内部调用 lua_error, 以获得相同的效果。
但要记住,你的函数现在是 "不安全的"。如果不进行修改,下面的代码将会执行类似 "抛出异常" 的操作,从而停止程序,如果 key1、key2 或 key3 是 "不正确的":
val1, val2, val3 = my_function("key1", "key2", "key3")
有时,如果输入错误,让程序 "崩溃" 也是可以接受的。根据你的设置,用户将会得到最后一个错误消息和堆栈跟踪,或类似的东西。
如果 "让程序崩溃" 不是一个选项,你可以使用 pcall 函数来做类似 "try-catch" 的操作,并添加一个名为
ok
的新变量:ok, val1, val2, val3 = pcall(my_function, "key1", "key2", "key3") if ok then -- 使用val1、val2和val3。 else print("ERROR: " .. val1) -- 注意,这里使用的是val1,而不是val2。 end
请注意,你不必将
pcall
放在my_function
正上方。就像异常一样,错误恢复可以发生在更高的调用链中:在调用my_function
的函数中、调用那个函数的函数中等等。例如,如果你从一个名为parent
的函数中调用my_function
,而parent
又被一个名为grandParent
的函数调用,你可以这样做:-- parent 是 "不安全的",因为 my_function 是 "不受保护的" function parent(key1, key2) local val1, val2, val3 = my_function(key1, key2, "key3") return val1, val2, val3 end -- grandParent 在 "安全" 的方式下调用 parent function grandParent() local ok, val1, val2, val3 = pcall(parent, "key1", "key2") if ok then -- 使用val1、val2和val3。 else print("ERROR: " .. val1) end end