gpt4 book ai didi

c++ - 发生错误后如何确保(luabind)lua 状态良好?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:35:04 24 4
gpt4 key购买 nike

当lua代码引发异常时,luabind会在栈上留下一条错误信息供我收集。我想知道如何保证在我处理完异常后lua堆栈处于合理状态:

  1. 我找到的示例告诉我使用 luabind::from_stack(e.state(), -1)。这不会将错误消息留在堆栈中吗?我不应该弹出它吗?

  2. 从堆栈中弹出错误消息是否足够?该错误是否导致其他垃圾留在堆栈中?

发生错误后如何确保lua状态良好?

这是我得到的:

try  {
// Do lua-stuff here that causes an exception from lua
}
catch (const luabind::error& e) {
luabind::object error_msg(luabind::from_stack(e.state(), -1));

std::stringstream ss;
ss << error_msg;

throw my_own_exception_class(ss.str());
}

最佳答案

  1. 它会将错误信息留在栈上。你是否应该弹出它完全取决于你接下来对堆栈所做的事情。如果您不再需要该消息(因为您已将其保存在其他地方),则将其弹出。如果您打算在捕获链的更下方使用它,请保留它。关键是,您使用 Lua 堆栈与 Lua API 进行通信,您拥有什么完全取决于您想告诉 API 什么。

  2. 这里的“垃圾”有两种解释方式:

    • 如“Lua 堆栈已破坏内部结构,对 lua_XXX 函数的任何调用都将出现 SEGFAULT/崩溃/等等”。无论您抛出什么 C++ 异常,这都不应该发生,防止这种情况是 Luabind 的责任。任何 C++ 异常都由 Luabind 抛出和处理,因为 Lua 本身是用 C 编写的,在它的世界中没有异常这样的东西。

    • 如“堆栈中有一些我不再需要的值”。堆栈上不应该有垃圾。如果您感到偏执,请在任何 Lua API 调用链之前随意使用 lua_settop(0) 清除堆栈

关于c++ - 发生错误后如何确保(luabind)lua 状态良好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6014252/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com