【问题标题】:C++ Lua Error HandlingC++ Lua 错误处理
【发布时间】:2013-08-11 14:36:43
【问题描述】:

我正在开发一个程序(C++,使用 D3D9)和 Lua。我已经实现了 LUA Api,除了错误处理之外,一切都运行良好。我用谷歌搜索了很多,我找到了一个可以处理大部分错误的解决方案。我写这个是因为其他错误。

我会用图片给你看一些相关的代码。

现在最重要的函数:PerformCall() 和 LuaErrorReport()

但是,正如我之前所说:正在处理一些错误。但是这个不是。

【问题讨论】:

    标签: c++ error-handling lua


    【解决方案1】:

    关于可能出错的一些想法。您将L 传递给lua_pcall,而LuaErrorReport 却得到State()。他们可能正在处理不同的lua_State,这可能发生在协程的上下文中。如果这是故意的,至少在某个地方说明为什么这样做。

    LuaErrorReport 中的 lua_pushvalue 看起来也很可疑。您如何知道堆栈中的底部值包含您要报告的消息?此函数从可能在堆栈上累积更多值的其他函数调用。我要么把它改成

    lua_pushvalue(L, -3);
    

    lua_pushstring(L, msg);
    

    最后,您还应该考虑将debug.traceback 作为错误函数传递给lua_pcall,以获得更有意义的堆栈跟踪错误消息。比如:

    void LUA::PerformCall(int return_amount)
    {
      lua_getglobal(L, "debug");
      lua_getfield(L, -1, "traceback");
      lua_remove(L, -2);
      int errindex = -p_iArgCount - 2;
      lua_insert(L, errindex);
      int error = lua_pcall(L, p_iArgCount, return_amount, errindex);
      // ...
    

    并摆脱LuaErrorReport 中的debug.trace 调用。

    【讨论】:

    • 您好,谢谢您的回答。所有代码都在具有私有成员 lua_State* L 的类 LUA 中。它还具有返回 L 的公共函数 lua_State* State()。我认为这不会导致错误。剩下的我明天试试。
    • 我测试了代码,现在一切正常。非常感谢。
    • 我还有一个问题。一旦错误处理函数处理了错误,错误就会不断发生(向控制台发送垃圾邮件)。有什么办法可以阻止这种情况?
    • @Freakyy PerformCall 如何被其他代码使用? “PerformCall”是否期望调用代码在调用之前以某种方式设置堆栈?通话结束后呢?
    • PerformCall 被调用每个 D3D9-BeginScene 来调用渲染函数。但是导致错误的函数只被调用一次。
    猜你喜欢
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 2015-07-13
    • 1970-01-01
    相关资源
    最近更新 更多