LuaJava中的错误在错误处理中。
2011-12-24 4:30:36
收藏:0
阅读:161
评论:2
我正在使用LuaJava从Java中调用一个简单的Lua函数。
calc.lua:
function foo(n) return n*2 end
这是在calc.lua中的全部内容,并且随后从命令行调用都可以工作。
这里始终出现错误的调用是:
L.getGlobal("foo");
L.pushNumber(8.0);
int retCode=L.pcall(1, 1,-2); // retCode的值始终为5,pcall(numArgs,numRet,errHandler)
String s = L.toString(-1); // s= "Error in Error Handling Code"
我还尝试过
L.remove(-2); L.insert(-2);
不确定为什么仍然会出现错误或错误是什么。也许我没有正确设置错误处理程序?因此不进行调用?在加载完成后,我尝试从控制台运行print(foo(5)),并如预期地获得10。
更新:看起来我需要在堆栈上提供一个错误处理程序。这种错误处理程序的签名是什么,我应该如何将它放置在堆栈上?谢谢。
原文链接 https://stackoverflow.com/questions/8621471
点赞
stackoverflow用户234175
这个内容摘自 Lua 的参考手册——在 C API 部分 中,它这样描述 pcall:
当你使用 lua_call 调用函数时,被调用函数内的任何错误都会向上传播(使用 longjmp)。如果你需要处理错误,那么你应该使用 lua_pcall:
int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc);
...
如果 errfunc 为 0,则返回的错误信息正是 原始的错误信息。 否则,errfunc 是用于错误处理的函数的堆栈索引。(在当前实现中,该索引无法是伪索引。)在运行时错误的情况下,该函数将被调用,其错误信息将是通过 lua_pcall 返回的信息的返回值。
因此,假设 LuaJava 的 API 只是镜像 C API,那么只需传递 0 来表示没有特殊的 errfunc。以下代码应该就能实现:
int retCode = L.pcall(1, 1, 0);
String errstr = retCode ? L.toString(-1) : "";
2011-12-24 01:47:23
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在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 模式将字符串(嵌套数组)转换为真正的数组?
为什么你提供了-2?那里本不应该有这个。你告诉 Lua 在 Lua 栈上存在一个错误函数来处理索引为 -2 处的错误,而你的代码并没有表明任何这样的内容。在大多数情况下,
pcall
只应该有两个参数。