Как мне убедиться, что состояние (luabind) lua исправно после возникновения ошибки? - PullRequest
2 голосов
/ 16 мая 2011

Когда код lua вызывает исключение, luabind оставит сообщение об ошибке в стеке для сбора.Мне интересно, как гарантировать, что стек lua ​​будет в разумном состоянии после того, как я обработаю исключение:

  1. Примеры, которые я нашел, говорят мне использовать luabind::from_stack(e.state(), -1).Разве это не оставит сообщение об ошибке все еще в стеке?Разве я не должен вытолкнуть его?

  2. Достаточно ли извлечь сообщение об ошибке из стека?Вызывает ли ошибка другой мусор в стеке?

Как убедиться, что состояние lua исправно после возникновения ошибки?

Эточто у меня есть:

try  {
    // Do lua-stuff here that causes an exception from lua
}
catch (const luabind::error& e) {
    luabind::object error_msg(luabind::from_stack(e.state(), -1));

    std::stringstream ss;
    ss << error_msg;

    throw my_own_exception_class(ss.str());
}

Ответы [ 2 ]

1 голос
/ 17 мая 2011
  1. Это оставит сообщение об ошибке в стеке.Должны ли вы вытолкнуть это полностью зависит от того, что вы делаете со стеком дальшеЕсли вам больше не нужно сообщение (так как вы сохранили его где-то еще), выведите его.Если вы собираетесь использовать его дальше по цепочке, оставьте его.Дело в том, что вы используете стек Lua для взаимодействия с API Lua, и то, что у вас есть, полностью зависит от того, что вы хотите сообщить API.

  2. Существует два способа интерпретации"мусор" здесь:

    • Как и в случае "стек Lua нарушил внутреннюю структуру, и любой вызов функций lua_XXX приведет к SEGFAULT / crash / etc".Это никогда не должно происходить независимо от того, какие исключения C ++ вы выбрасываете, ответственность за это лежит на Luabind.Любые исключения C ++ создаются и обрабатываются Luabind, так как сам Lua написан на C, и в его мире нет таких вещей, как исключения.

    • Как и в «есть некоторые значения в стеке, которые мне больше не нужны».В стеке не должно быть мусора.Если вы чувствуете себя параноиком, не стесняйтесь очищать стек с помощью lua_settop(0) до того, как любая цепочка Lua API вызовет

0 голосов
/ 04 августа 2012

Самый простой способ, вероятно, это

 int luaErr = luaL_dofile(luaState, "main.lua"); // or other lua stuff
 if (luaErr != 0)
      std::cout << "Lua error: " << lua_tostring(luaState, -1) << std::end
...