我正在尝试将lua嵌入到我的游戏引擎中。到目前为止一切顺利。我开始注册与游戏引擎接口的函数(例如move_object(id,x,y)),注册工作正常。接下来,我尝试使用它:
handlers={}
handlers["update"] = function(objId)
-- print(objId)
move_object(objId, 0, 0)
end
这给了我luabind的“运行时错误”异常。我到处搜索,并根据互联网(和luabind源),错误消息应该仍然在lua堆栈的顶部。我尝试捕获luabind :: error,并打印堆栈的顶部,如下所示:
std::cout << "error: lua: " << lua_tostring(exc.state(), -1) << std::endl;
并且像这样:
std::cout << "error: lua: " << luabind::object(luabind::from_stack(exc.state(), -1)) << std::endl
并打印出来:
error: lua: update
我假设它是我从处理程序表调用更新函数时推送的最后一个值。在遇到错误时,应该使用详细的错误字符串覆盖此值,对吗?根据{{1}}的定义中的luabind源文件“error.hpp”:
class error
我相信我的lua代码的问题实际上是我的move_object函数的注册(更新函数运行。我知道这一点,因为我之前没有注释打印调用),但我不能确定没有更好的错误信息!哈哈
如果有任何帮助,我修正了错误。我正在定义move_object函数:
// this exception usually means that the lua function you called
// from C++ failed with an error code. You will have to
// read the error code from the top of the lua stack
// the reason why this exception class doesn't contain
// the message itself is that std::string's copy constructor
// may throw, if the copy constructor of an exception that is
// being thrown throws another exception, terminate will be called
// and the entire application is killed.
但显然,您无法使用luabind将静态成员函数定义为常规函数。我将其更改为此(使luabind::module(m_L)[
luabind::def("move_object", &ScriptEntityManager::move_object)
];
成为C ++中的常规全局函数):
move_object
我不知道这是否有助于原始问题,但我认为更多的信息不会伤害! :)
答案 0 :(得分:2)
捕获luabind异常时,我也会收到错误消息的错误值。我已经通过设置luabind(set_pcall_callback)使用的错误处理程序解决了这个问题,因此它会输出错误(和callstack),这个错误在抛出异常之前发生。这样对我来说很好。
但如果有人确实知道为什么堆栈顶部在捕获异常时不包含错误消息,我也很感兴趣: - )
这是我使用的错误处理程序,以防它可以帮助某人(其中“print”是一些可以记录std :: string的自定义函数):
int luabindErrorHandler( lua_State* L )
{
// log the error message
luabind::object msg( luabind::from_stack( L, -1 ) );
std::ostringstream str;
str << "lua> run-time error: " << msg;
print( str.str() );
// log the callstack
std::string traceback = luabind::call_function<std::string>( luabind::globals(L)["debug"]["traceback"] );
traceback = std::string( "lua> " ) + traceback;
print( traceback.c_str() );
// return unmodified error object
return 1;
}