我正在开发一个程序(C++,使用 D3D9)和 Lua。我已经实现了 LUA Api,除了错误处理之外,一切都运行良好。我用谷歌搜索了很多,我找到了一个可以处理大部分错误的解决方案。我写这个是因为其他错误。
我将在图片中向您展示一些相关代码。
现在最重要的函数:PerformCall() 和 LuaErrorReport()
但是,正如我之前所说:正在处理一些错误。但这个不是。
我正在开发一个程序(C++,使用 D3D9)和 Lua。我已经实现了 LUA Api,除了错误处理之外,一切都运行良好。我用谷歌搜索了很多,我找到了一个可以处理大部分错误的解决方案。我写这个是因为其他错误。
我将在图片中向您展示一些相关代码。
现在最重要的函数:PerformCall() 和 LuaErrorReport()
但是,正如我之前所说:正在处理一些错误。但这个不是。
关于可能出错的一些想法。你正在通过L
一段lua_pcall
时间LuaErrorReport
来State()
代替。他们可能正在处理不同lua_State
的事情,这可能发生在协程的上下文中。如果这是故意的,至少在某个地方说明为什么要这样做。
内部看起来也很可疑lua_pushvalue
。LuaErrorReport
您如何知道堆栈中的底部值包含您要报告的消息?此函数从可能在堆栈上累积更多值的其他函数调用。我要么把它改成
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);
// ...
并摆脱debug.trace
调用LuaErrorReport
。