C++ Lua 错误处理

标签 c++ error-handling lua

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

我将在图片中向您展示一些相关代码。

Code Part 1 (LUA)

Code Part 2 (LUA)

Part 3 (Console Output)

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

Part 4 (C++) Part 5 (PerformCall)

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

最佳答案

关于可能出错的一些想法。您正在为 lua_pcall 传递 L,而 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 调用。

关于C++ Lua 错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18173054/

相关文章:

c# - 在每个异常上触发特定的ErrorHandlerAttribute?

random - 如何以更高的频率获取某个 "random range"?

Lua:何时以及如何将表写入_G

c++ - `delete this` 安全吗?

c++ - 将 argv 转换回单个字符串

jquery - 用jquery-ajaxq实现重试逻辑的最佳方法是什么?

ms-access - 处理Access中的输出错误

Luad 使用独立的 Lua

c++ - 如何将 C++ 源代码片段放入字符串中?

c++ - C++ 中基类和派生类的作用域