我正在开发一个程序(C++,使用 D3D9)和 Lua。我已经实现了 LUA Api,除了错误处理之外,一切正常。我在谷歌上搜索了很多,然后找到了一个可以处理大部分错误的解决方案。我写这篇文章是因为其他错误。
我将在图片中向您展示一些相关代码。
现在最重要的函数:PerformCall() 和 LuaErrorReport()
但是,正如我之前所说:正在处理一些错误。但这个不是。
最佳答案
关于可能出错的一些想法。您正在为 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/