使用 Lua 的 C API 在控制台打印错误的方法
2017-5-20 8:0:3
收藏:0
阅读:83
评论:2
我一直在寻找一种使用 Lua 的 C API 处理错误并在控制台打印出它们的方法,但是我找不到一个有效的例子。我希望能够做到以下简单的事情:
static int test(lua_State *L)
{
if(!lua_isstring(L, 1))
return luaL_error(L, "This is not a valid string");
}
或者
static int test(lua_State *L)
{
try
{
if (!lua_isstring(L, 1))
{
throw luaL_error(L, "This is not a valid string");
}
}
catch (int e)
{
std::cout << "Error " << e << std::endl;
}
}
但是到目前为止没有任何结果。正确的方法是什么?使用 LUA C API 处理错误并在控制台显示消息的正确方式是什么?
点赞
用户872616
我有完全相同的问题,而catwell的回答并没有完全回答我的问题。我最初在我的程序中所做的只是调用
luaL_dofile(L, "example.lua");
发生错误时没有任何反应。
“如果您从标准Lua解释器中调用它……”是一个很好的提示。因此,我查看了luac.c中的主要部分:
if (lua_pcall(L,2,0,0)!=LUA_OK) fatal(lua_tostring(L,-1));
请注意,luaL_dofile也会扩展到lua_pcall。因此,如果在完成该文件时引发错误,那么唯一发生的事情就是错误消息被推送到L的堆栈上。这是您的责任要做一些事情。
因此,我相应地修改了我的代码:
#include <stdio.h> // fprintf, stderr
#include <stdlib.h> // exit, EXIT_FAILURE
static void fatal(const char* message) {
fprintf(stderr,"%s\n", message);
exit(EXIT_FAILURE);
}
int main(void) {
...
if (luaL_dofile(L, "example.lua") != LUA_OK) {
fatal(lua_tostring(L,-1));
}
...
}
2018-05-19 11:08:02
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在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 代码?

第一个代码示例是在 Lua 中处理错误的正确方法之一,但你似乎对它的工作方式感到困惑。
你正在编写一个实现将暴露给 Lua 的接口的 C 函数。它的工作方式类似于这样的 Lua 代码:
local function test(s) if type(s) ~= "string" then error("This is not a valid string") end end导致错误的代码不是
test函数,而是调用它并传递无效参数的代码。当 Lua 代码以无效方式调用该函数时(例如:
test(42)),它将引发 Lua 错误,并将字符串作为错误消息。如果您从标准 Lua 解释器中调用它,它将停止程序,打印错误消息和堆栈跟踪。如果你想在 Lua 代码中做一些其他的事情,例如只是打印错误消息,你可以使用
pcall捕获错误,它的用法有点像其他语言中的 try/catch:local ok, err_msg = pcall(test, 42) if not ok then print(err_msg) end请注意,由于此错误是由无效的参数类型引起的,因此对于你的代码来说,使用 luaL_checkstring / luaL_checklstring、luaL_argcheck 或 luaL_argerror 之一代替
luaL_error可能会更加优化。如果您想了解有关 C API 的更多信息,我建议您阅读书籍“Programming in Lua(第四版)”中的专门章节。