Формат сообщения об ошибке
Первая строка ошибки содержит три ключевых элемента:
- Путь к файлу, вызывающему ошибку.
- Номер строки, где произошла ошибка.
- Описание самой ошибки.
Пример:
[ERROR] addons/my_addon/lua/autorun/server/sv_my_addon_autorun.lua:2: attempt to call global 'Print' (a nil value)
Здесь: файл sv_my_addon_autorun.lua, строка 2, ошибка — попытка вызвать несуществующую функцию Print.
Типичные ошибки и способы их исправления
1. attempt to call global '?' (a nil value)
- Причина: вызов несуществующей функции или опечатка в имени.
- Пример: Print("Hello") вместо print("Hello").
- Исправление:
проверьте правильность написания имени функции;
убедитесь, что функция существует и определена в нужной области видимости.
2. attempt to perform arithmetic on global '?' (a nil value)
- Причина: арифметическая операция с неопределённой или нечисловой переменной.
- Пример:lualocal x
print(x + 5) -- x = nil - Исправление:
инициализируйте переменные перед использованием;
проверяйте тип данных: if type(var) == "number" then ....
3. attempt to index global 'varname' (a nil value)
- Причина: обращение к полю таблицы, которая не определена.
- Пример: print(myTable.key) при myTable = nil.
- Исправление:
убедитесь, что таблица инициализирована: local myTable = {};
проверяйте на nil перед обращением: if myTable then ....
4. malformed number near 'number'
- Причина: некорректное число в коде (например, 1.2.3, 2f).
- Исправление:
используйте правильный формат чисел: 1.23;
храните IP‑адреса и подобные данные в виде строк.
5. unexpected symbol near 'symbol'
- Причина: синтаксическая ошибка (незакрытые скобки, пропущенные then и т. д.).
- Пример: if x > 0 print("OK") end (пропущен then).
- Исправление:
проверьте синтаксис конструкции;
убедитесь, что все скобки и блоки (if/end, function/end) закрыты.
6. 'symbol1' expected near 'symbol2'
- Причина: ожидался один символ, но найден другой (часто из‑за пропущенных запятых или скобок).
- Пример: {1, 2 3} (пропущена запятая).
- Исправление:
добавьте недостающий символ (запятую, скобку и т. п.);
проверьте отступы и структуру кода.
7. Couldn't include file 'file' - File not found
- Причина: попытка подключить несуществующий файл.
- Исправление:
проверьте путь к файлу;
убедитесь, что файл существует и доступен;
перезапустите сервер, если файл добавлен во время работы.
8. bad argument #1 to 'function' (... expected, got ...)
- Причина: неверный тип аргумента для функции.
- Примеры:
pairs(nil) — ожидается таблица, получено nil;
tostring(5 + "abc") — операция между числом и строкой. - Исправление:
проверяйте типы аргументов перед вызовом: assert(type(arg) == "table", "Expected table")
используйте tostring()/tonumber() для преобразования.
9. Ошибки времени выполнения (runtime)
- Причины:
бесконечный цикл (while true do ... без break);
рекурсия без условия выхода;
превышение лимита времени выполнения. - Исправление:
добавляйте счётчики и условия выхода в циклы;
ограничивайте глубину рекурсии;
разбивайте тяжёлые операции на части.
Инструменты и методы отладки
1. print() — простой вывод значений
Используйте для отслеживания значений переменных и хода выполнения:
lua
local x = 10
print("Значение x:", x)
2. assert() — проверка условий
Прерывает выполнение с ошибкой, если условие ложно:
lua
function divide(a, b)
assert(b ~= 0, "Деление на ноль!")
return a / b
end
3. error() — принудительное создание ошибки
Полезно для отладки и обработки исключительных ситуаций:
lua
if not player then
error("Игрок не найден!")
end
4. pcall() — безопасный вызов функций
Позволяет перехватить ошибку без остановки скрипта:
lua
local success, result = pcall(function()
return riskyOperation()
end)
if not success then
print("Ошибка:", result)
end
5. Внешние инструменты
- ZeroBrane Studio — IDE с интегрированным отладчиком для Lua.
- MobDebug — удалённый отладчик.
- LuaJIT’s DynASM — инструмент для анализа байт‑кода.
Чек‑лист отладки
- Проверьте сообщение об ошибке:
найдите файл и строку с ошибкой;
проанализируйте описание ошибки. - Используйте print():
выводите значения переменных в ключевых точках;
отслеживайте поток выполнения (например, «Функция X вызвана»). - Добавьте проверки:
assert() для критических условий;
проверки на nil перед использованием переменных. - Упростите код:
изолируйте проблемный участок;
тестируйте его отдельно. - Проверьте типы данных:
используйте type(var) для диагностики;
убедитесь, что аргументы функций корректны. - Анализируйте логи:
ищите цепочки вызовов (трассировку);
обращайте внимание на цвет сообщений (синий — сервер, жёлтый — клиент). - Протестируйте граничные случаи:
пустые таблицы;
нулевые значения;
крайние условия циклов.
Практические советы
- Именовайте переменные понятно: playerHealth вместо ph.
- Разбивайте код на функции: маленькие блоки легче отлаживать.
- Добавляйте комментарии: поясняйте сложную логику.
- Сохраняйте резервные копии: перед крупными изменениями.
- Тестируйте постепенно: вносите одно изменение за раз.
- Используйте IDE: подсветка синтаксиса и автодополнение снижают число опечаток.
- Изучайте документацию: проверяйте сигнатуры функций и ожидаемые типы аргументов.
Если хотите, могу разобрать конкретный пример ошибки или помочь с отладкой вашего скрипта!