为LuaState设置错误处理程序,使用pcall(a,b, error_function_index)。
2011-12-24 3:44:1
收藏:0
阅读:109
评论:2
我正在尝试调用:
LuaState.pcall(num_args,num_returns, error_handler_index).
我需要知道如何为此函数设置错误处理程序。实际上,我认为如果有人展示如何使用LuaJava调用Lua函数并获得数值结果,那将很好。这可能会节省很多时间和问题。我正在查找但找不到错误函数的签名以及如何将其放置在LuaState堆栈上的正确位置。所有的Java->Lua示例都是打印返回值或设置在使用Lua传入的Java对象上的值。我想看看如何直接调用Lua函数并返回结果的方法。
更新:一种解决方法是使用LuaState.pcall(1,1,0)不传递错误处理程序,通过传递零来进行此操作:
String errorStr;
L.getGlobal("foo");
L.pushNumber(8.0);
int retCode=L.pcall(1,1,0);
if (retCode!=0){
errorStr = L.toString(-1);
}
double finalResult = L.toNumber(-1);
其中已经加载了calc.lua:
function foo(n)
return n*2
end
现在是否有办法设置错误处理程序?谢谢
原文链接 https://stackoverflow.com/questions/8621939
点赞
stackoverflow用户221509
如果你也想要堆栈回溯(我确定你想要的:),你可以把debug.traceback
作为错误函数进行传递。看一看AndroLua中它是如何实现的。
基本上,你必须确保你的堆栈设置如下:
- 错误处理程序(
debug.traceback
) - 你要调用的函数
- 参数
你可以像下面例子中这样做:
L.getGlobal("debug");
L.getField(-1, "traceback"); // 处理程序
L.getGlobal("foo"); // 函数
L.pushNumber(42); // 参数
if (L.pcall(1, 1, -3) != 0) { ... // ... 你知道的 ...
2011-12-24 13:51:41
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在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 函数来处理错误:
function err_handler(errstr) -- 进行异常处理,栈会被弹空但控制权还没回到调用方手中 -- 在这里可以做任何你需要的操作 return "我捕获了一个错误!" .. errstr end
你可以把这个
err_handler
函数传递给你的pcall
函数:double finalResult; L.getGlobal("err_handler"); L.getGlobal("foo"); L.pushNumber(8.0); // err_handler, foo, 8.0 if (L.pcall(1, 1, -3) != 0) { // err_handler, error message Log.LogError( L.toString(-1) ); // "我捕获了一个错误!" .. errstr } else { // err_handler, foo 的结果 finalResult = L.toNumber(-1); } // 执行完毕后,将堆栈还原到初始状态 L.pop(2);