Чтение ошибок
Ошибки — обычная часть программирования. Их делают каждый день даже опытные программисты. Важно быстро находить и исправлять их, и в этом помогают сообщения об ошибках. В Lua два вида ошибок, и сообщения о них выглядят немного по-разному.
Синтаксические ошибки. Прежде чем запустить программу, Lua читает её целиком и проверяет, что она написана по правилам языка — по его синтаксису. Найдя ошибку, например пропущенную кавычку, он вообще не запускает программу, даже строки перед ошибкой. В этой программе на строке 2 не хватает кавычки:
print("Доброе утро, Эмма!")
print("Покормить кур)
print("Подоить Беллу")Вывод остаётся пустым, а под ним Lua показывает красное сообщение об ошибке:
main.lua:2: unfinished string near '"Покормить кур)'Читайте его слева направо:
main.lua— имя файла с программой. На этом сайте программа в редакторе всегда называетсяmain.lua.2— номер строки с ошибкой. Номера строк видны слева от редактора.- После второго двоеточия идёт описание ошибки, по-английски.
unfinished stringозначает текст (строку), который не закончен.nearпоказывает, где Lua заметил проблему: у текста, который начинается с"Покормить кур). Закрывающей кавычки нет, поэтому текст продолжается до конца строки, и)стала его частью.
Сообщение говорит, где Lua заметил ошибку, а это не всегда там, где она сделана. Если скобка не закрыта, Lua узнаёт об этом только на следующей строке:
print("Доброе утро, Эмма!"
print("Покормить кур")Lua сообщает:
main.lua:2: ')' expected (to close '(' at line 1) near 'print'')' expected означает, что Lua ждал ), а (to close '(' at line 1) говорит, какую именно скобку нужно закрыть: ту, что на строке 1. Поэтому, если строка из сообщения выглядит правильно, проверьте строку выше. А когда Lua доходит до конца программы и всё ещё чего-то ждёт, сообщение заканчивается на near <eof>: eof — сокращение от end of file, «конец файла».
Ошибки при выполнении. Программа без синтаксических ошибок запускается, и Lua выполняет её строки одну за другой. Дойдя до команды, которую выполнить нельзя, он останавливается. То, что программа успела вывести, остаётся в выводе, а сообщение об ошибке появляется под ним:
print("Доброе утро, Эмма!")
print("Покормить кур")
prnt("Подоить Беллу")
print("Полить морковь")Программа выводит первые две строки, а затем появляется красное сообщение об ошибке:
Доброе утро, Эмма!
Покормить кур
main.lua:3: attempt to call a nil value (global 'prnt')
stack traceback:
main.lua:3: in main chunkПервая строка сообщения состоит из тех же частей, что и раньше: файл, строка (3) и описание. attempt to call a nil value (global 'prnt') означает, что программа попыталась вызвать что-то с именем prnt, но ничего (nil) с таким именем нет. Lua знает print, но не знает prnt. Когда видите attempt to call a nil value, ищите неправильно написанное имя, например prnt или Print.
Ниже stack traceback: перечисляет, где находилась программа, когда случилась ошибка, начиная с самого последнего места. main.lua:3: in main chunk означает строку 3 в основной части вашей программы. Когда в программах появятся собственные функции, этот список станет длиннее и покажет, какая функция какую вызвала. Пока всё, что нужно, сообщает первая строка. Строку трассировки, которая начинается с [C]:, можно пропустить: это часть самого Lua (он написан на языке C).
Сообщения, которые вы будете встречать часто:
unfinished string: не хватает кавычки в конце текста или кавычки разные, как в"Привет'.')' expected: не хватает скобки или слова записаны без кавычек:print(Good morning)даёт')' expected near 'morning'.attempt to call a nil value: неправильно написано имя функции.attempt to add a 'string' with a 'number':+вместо..при склейке текста и числа.
Всегда исправляйте первую ошибку, о которой сообщает Lua, и запускайте программу снова. Синтаксическая ошибка может скрывать другие, потому что пока её не исправят, ничего не запускается. А ошибка при выполнении останавливает программу, поэтому строки ниже ещё не проверены.
Задание
- 1
В вечернем отчёте Эммы в редакторе три ошибки. Запустите программу и прочитайте сообщение: на какой строке ошибка и что не так? Исправьте её и запустите программу снова. Повторяйте, пока программа не выведет:
Вечерний отчёт Яиц сегодня: 12 Молоко: 12 литров Монеты: 60 Завтра: дождь Спокойной ночи, Рекс!