c++ - lua+luabind,栈顶无错误信息, "runtime error"之后

标签 c++ lua runtime-error luabind

我正在尝试将 lua 嵌入到我的游戏引擎中。到目前为止一切都运转良好。我开始注册函数以与游戏引擎交互(例如 move_object(id, x, y)),并且注册工作正常。接下来,我尝试像这样使用它:

handlers={}

handlers["update"] = function(objId)
--  print(objId)
    move_object(objId, 0, 0)
end

这给了我一个来自 luabind 的“运行时错误”异常。我到处搜索,根据互联网(和luabind源),错误消息应该仍然在lua堆栈的顶部。我 try catch 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

我认为这只是我从处理程序表调用更新函数时推送的最后一个值。遇到错误时,应该使用详细的错误字符串覆盖该值,对吗?根据luabind源文件“error.hpp”处class error的定义:

// 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.

我相信我的lua代码的问题实际上是我的move_object函数的注册(更新函数运行。我知道这一点,因为我之前已经取消注释了打印调用),但如果没有一些更好的错误信息,我无法确定!哈哈

我修复了这个错误,如果有帮助的话。我像这样定义 move_object 函数:

luabind::module(m_L)[
    luabind::def("move_object", &ScriptEntityManager::move_object)
];

但显然,您不能使用 luabind 将静态成员函数定义为常规函数。我将其更改为此(使 move_object 成为 C++ 中的常规全局函数):

luabind::module(m_L)[
    luabind::def("move_object", move_object)
];

我不知道这是否有助于解决最初的问题,但我认为更多信息不会有什么坏处! :)

最佳答案

在捕获 luabind 异常时,我还得到错误消息的错误值。我通过设置 luabind (set_pcall_callback) 使用的错误处理程序解决了这个问题,以便它打印错误(和调用堆栈),这在引发异常之前发生。这样对我来说效果很好。

但是如果有人真的知道为什么在捕获异常时堆栈顶部不包含错误消息,我也很感兴趣:-)

这是我使用的错误处理程序,以防它可以帮助某人(其中“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;
}

关于c++ - lua+luabind,栈顶无错误信息, "runtime error"之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10768610/

相关文章:

Lua - 为协程指定库

flash - 如何判断.swf产生了什么错误?

dynamic - 为什么在 Rust 中使用动态错误而不是枚举很常见?使用编译时变体不好/不可能吗?

c++ - 带有样式表的 QProgressBar

sdk - 如何检测 Corona SDK 中的 TouchOut 事件?

Lua表差异键函数

php - 功能导致脚本停止在PHP

C++ 编译器错误无法访问类 'std::basic_ios<_Elem,_Traits>' 中声明的私有(private)成员

c++ - 在 C++ 代码中初始化 C 结构

c++ - 在 Win32 中使用 IShellLinkA 和 IPersistFile 创建文件快捷方式时生成的 Unicode 文件名