0Pricing
Lua Academy · Урок

Управление состоянием и обработка ошибок

Используйте 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 — локальная установка не требуется.

Все уроки этого курса

  1. Модель стека C API Lua
  2. Вызов функций Lua из C
  3. Регистрация функций C в Lua
  4. Управление состоянием и обработка ошибок
← Назад к Lua Academy