Управление состоянием и обработка ошибок
Используйте lua_pcall для защищённых вызовов и обрабатывайте ошибки на уровне C.
«Управление состоянием и обработка ошибок» — бесплатный урок Lua Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
Несколько состояний Lua
В одном процессе можно запустить несколько экземпляров lua_State. Каждый из них полностью независим: отдельные глобальные переменные, отдельные стеки и отсутствие общей памяти по умолчанию.
Состояния потоков
lua_newthread(L) создаёт дочерний поток (сопрограмму), использующий то же глобальное окружение, но имеющий собственный стек. Так реализуются сопрограммы Lua в C.
Обмен данными между состояниями
Данные нельзя напрямую передавать между независимыми состояниями Lua. Сериализуйте их в строки или используйте структуры общей памяти на стороне C, доступные через пользовательские данные.
Защищённые и обычные вызовы
lua_pcall перехватывает ошибки (внутри использует setjmp/longjmp). lua_call распространяет ошибки и прерывает программу. В рабочем коде всегда используйте lua_pcall.
// Safe:
if (lua_pcall(L, nargs, nresults, 0) != LUA_OK) {
const char *err = lua_tostring(L, -1);
lua_pop(L, 1);
// handle error
}Объекты ошибок
Ошибки в Lua могут быть любыми значениями, а не только строками. error({code=404, msg="not found"}) помещает таблицу в качестве ошибки. При сбое pcall код C считывает её из стека.
Обработчик аварийного завершения
Если ошибка выходит за пределы pcall (например, из функции C, вызванной без защиты), Lua перед прерыванием вызывает обработчик аварийного завершения, заданный через lua_atpanic(L, fn).
// C code
lua_atpanic(L, function(lua_State *L) {
fprintf(stderr, "PANIC: %s\n", lua_tostring(L, -1));
exit(1);
return 0;
});Восстановление стека после ошибки
После ошибки lua_pcall стек восстанавливается в состояние, существовавшее до вызова (за исключением функции и аргументов; объект ошибки остаётся на вершине).
Очистка состояния
После завершения всегда закрывайте состояние с помощью lua_close(L). Это запускает все финализаторы __gc и освобождает всю выделенную память.
Безопасность потоков
Состояние Lua не является потокобезопасным. Никогда не вызывайте одновременно две функции C API для одного состояния. Используйте одно состояние на поток OS или мьютекс для последовательного доступа.
Аллокатор памяти
По умолчанию Lua использует realloc. Передайте пользовательский аллокатор с помощью lua_newstate(allocFn, ud) для отслеживания памяти, задания ограничений или использования пользовательских пулов.
Песочница с несколькими состояниями
Запускайте ненадёжный код в новом изолированном состоянии Lua, не открывая стандартные библиотеки. Любой сбой или исчерпание ресурсов ограничивается этим состоянием.
Вопрос об обработке ошибок
В чём разница между lua_call и lua_pcall?
Итоги: управление состояниями и ошибками
В рабочем коде используйте lua_pcall (никогда не lua_call). Задайте обработчик аварийного завершения для крайнего случая восстановления. Используйте одно состояние на поток. Для создания песочницы применяйте несколько изолированных состояний. Для очистки всегда вызывайте lua_close.
Часто задаваемые вопросы
Урок «Управление состоянием и обработка ошибок» бесплатный?
Да — полный текст урока «Управление состоянием и обработка ошибок» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Управление состоянием и обработка ошибок»?
Используйте lua_pcall для защищённых вызовов и обрабатывайте ошибки на уровне C. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Управление состоянием и обработка ошибок»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Модель стека C API Lua
- Вызов функций Lua из C
- Регистрация функций C в Lua
- Управление состоянием и обработка ошибок