Как мне обрабатывать ошибки в Lua при выполнении произвольных строк?

Здесь я стремлюсь к абсолютному минимализму. (Прошло некоторое время с тех пор, как я работал с Lua C API.)

#include <lua.hpp>
#include <iostream>
#include <string>
using namespace std;

int main(int argc, char** argv)
{
    lua_State* state = luaL_newstate();
    luaL_openlibs(state);

    string input;

    while (getline(cin, input))
    {
        auto error = luaL_dostring(state, input.c_str());

        if (error)
        {
            cerr << "Lua Error: " << lua_tostring(state, -1) << '\n';
            lua_pop(state, 1);
        }
    }

    lua_close(state);
    return 0;
}

Эта программа работает нормально, пока я кормлю ее идеальным Lua. Однако, если я ввожу что-то неправильное (например, asdf()), программа вылетает! Почему он не обрабатывает мою ошибку изящно?

Я уже пытался разорвать звонки. Он падает при вызове самого lua_pcall. Я никогда не перехожу эту черту.


person TheBuzzSaw    schedule 27.03.2014    source источник
comment
Вы проверили stderr?   -  person imreal    schedule 27.03.2014
comment
Ваша программа мне подходит. (Однако мне пришлось заменить auto на int.)   -  person lhf    schedule 27.03.2014
comment
У меня те же результаты, что и у @lhf. Какой компилятор вы используете? Что именно здесь означает сбой? Что это за операционная система?   -  person Etan Reisner    schedule 27.03.2014
comment
Нууууу... видимо мне просто не повезло. Смотрите мой ответ ниже. :(   -  person TheBuzzSaw    schedule 27.03.2014
comment
@EtanReisner, по сути, это была ошибка сегмента Windows. Эта программа перестала работать. Он буквально просто выходит из программы, как только достигает lua_pcall. Вы сможете воспроизвести мои результаты, если загрузите статическую библиотеку 5.2.1 x64.   -  person TheBuzzSaw    schedule 27.03.2014


Ответы (1)


Загрузка бинарного файла (кажется, 5.2.1) содержит ошибку, исправленную в версии 5.2.3. Я пересобрал библиотеку из исходников, и теперь моя программа работает нормально.

person TheBuzzSaw    schedule 27.03.2014