На каком этапе создания программы могут появиться синтаксические ошибки
Обновлено: 21.11.2024
Синтаксическая ошибка в информатике — это ошибка в синтаксисе языка кодирования или программирования, введенная программистом. Синтаксические ошибки перехватываются программой, называемой компилятором, и программист должен исправить их перед компиляцией и запуском программы.
Techopedia объясняет синтаксическую ошибку
Один из способов представить синтаксическую ошибку состоит в том, что она представляет собой важную контрольную функцию в отношении ясности и удобства использования кода. Как и в других цифровых технологиях, таких как адрес электронной почты, пропуск или неправильное размещение всего одной буквы, цифры или символа создает критические проблемы для вычислительной системы, которая должна считывать код линейным образом. Также полезно подумать об обычных причинах синтаксических ошибок: либо программист делает опечатку, либо забывает формат или последовательность какого-либо слова или команды.
Синтаксические ошибки отличаются от ошибок, влияющих на программы во время выполнения. Многие логические ошибки в компьютерном программировании не обнаруживаются компилятором, потому что, хотя они могут вызывать серьезные ошибки во время работы программы, они соответствуют синтаксису программы. Другими словами, компьютер не может сказать, создаст ли логическая ошибка проблемы, но он может сказать, когда код не соответствует синтаксису, потому что понимание этого синтаксиса встроено в собственный интеллект компилятора.
Другой аспект понимания синтаксических ошибок заключается в том, что они демонстрируют, как, в отличие от людей, компьютеры не могут использовать ввод, который не идеально спроектирован. Отсутствие точки или запятой в предложении или команде или двух переставленных букв в слове сбивает с толку компилятор и делает его работу невозможной. С другой стороны, люди-читатели могут замечать типографские ошибки и понимать их в контексте того, что они читают. Вполне вероятно, что по мере развития компьютеров в ближайшие десятилетия инженеры смогут создавать компиляторы и системы, способные обрабатывать некоторые типы синтаксических ошибок; даже сейчас в некоторых средах компиляции инструменты могут автоматически исправлять синтаксические ошибки на месте.
Обнаружение различных типов ошибок в программировании – важная часть процесса разработки. Лучшие разработчики легко ориентируются в ошибках, которые они создают, и быстро их исправляют.
Сегодня мы поговорим о семи наиболее распространенных типах ошибок программирования и о том, как их избежать.
1. Синтаксические ошибки
Как и человеческие языки, компьютерные языки имеют правила грамматики. Но в то время как люди могут общаться с далеко не совершенной грамматикой, компьютеры не могут игнорировать ошибки, т. е. синтаксические ошибки.
Например, предположим, что правильный синтаксис для вывода чего-либо — print('hello') , и мы случайно забыли одну из скобок при написании кода. Произойдет синтаксическая ошибка, и это остановит запуск программы.
По мере того, как ваш уровень владения языком программирования повышается, вы будете реже делать синтаксические ошибки. Самый простой способ не допустить, чтобы они вызывали у вас проблемы, — узнать о них заранее. Многие текстовые редакторы или IDE имеют возможность предупреждать вас о синтаксических ошибках во время написания.
Совет: пишите быстрее с TextExpander
TextExpander позволяет легко сохранять часто используемые фрагменты кода, комментарии к документации и многое другое, а затем вставлять их в любое место с помощью простого сочетания клавиш или встроенного поиска.
2. Логические ошибки
Логические ошибки сложнее всего отследить. Все выглядит так, как будто это работает; вы только что запрограммировали компьютер на неправильные действия. Технически программа правильная, но результаты будут не такими, как вы ожидали.
Если вы не проверили требования заранее и не написали код для возврата самого старого пользователя в вашей системе, когда вам нужен самый новый, у вас возникла бы логическая ошибка.
Известный случай произошел в 1999 году, когда НАСА потеряло космический корабль из-за просчетов между английскими и американскими подразделениями. Программное обеспечение было закодировано одним способом, но должно было работать по-другому.
При написании тестов покажите их менеджеру продукта или владельцу продукта, чтобы убедиться, что логика, которую вы собираетесь написать, верна. В приведенном выше примере кто-то, кто ближе к бизнесу, заметил бы, что вы не упомянули тот факт, что требуется самый новый пользователь.
3. Ошибки компиляции
Для некоторых языков программирования требуется этап компиляции. При компиляции ваш язык высокого уровня преобразуется в язык более низкого уровня, который компьютер может лучше понять. Ошибка компиляции или времени компиляции возникает, когда компилятор не знает, как превратить ваш код в код более низкого уровня.
В нашем примере синтаксической ошибки, если бы мы компилировали print('hello' , компилятор остановился бы и сообщил нам, что не знает, как преобразовать это в язык более низкого уровня, потому что он ожидал a ) после ' .
Если в вашем программном обеспечении возникнет ошибка во время компиляции, вы не сможете его протестировать или запустить.
Так же, как и синтаксические ошибки, со временем вы научитесь их избегать, но в целом лучшее, что вы можете сделать, – это своевременно получать обратную связь, когда это происходит.
Компиляция происходит одновременно для всех файлов вашего проекта. Если вы внесли много изменений и видите много предупреждений или ошибок компилятора, это может быть очень сложно. Часто запуская компилятор, вы быстрее получите необходимую обратную связь, и вам будет легче понять, где решать проблемы.
4. Ошибки выполнения
Ошибки выполнения возникают, когда пользователь выполняет вашу программу. Код может работать правильно на вашем компьютере, но на веб-сервере может быть другая конфигурация, или с ним могут взаимодействовать таким образом, что это может вызвать ошибку во время выполнения.
Если ваша система взяла ввод из формы и попыталась сделать первую букву имени заглавной, выполнив что-то вроде params[:first_name].capitalize , это сломается, если форма будет отправлена без имени.
Ошибки во время выполнения особенно раздражают, поскольку они напрямую влияют на конечного пользователя. Многие из этих других ошибок случаются, когда вы работаете за компьютером над кодом. Эти ошибки возникают во время работы системы и могут помешать кому-либо выполнить то, что ему нужно.
Убедитесь, что у вас есть хорошие отчеты об ошибках, чтобы фиксировать любые ошибки во время выполнения и автоматически открывать новые ошибки в вашей системе тикетов. Старайтесь учиться на каждом отчете об ошибке, чтобы в будущем вы могли защититься от этого типа ошибок.
Использование фреймворков и кода, поддерживаемого сообществом, — отличный способ свести к минимуму эти типы ошибок, потому что код находится во многих разных проектах, поэтому он уже обнаружил и исправил множество проблем.
5. Арифметические ошибки
Арифметическая ошибка – это разновидность логической ошибки, но она связана с математикой. Типичным примером при выполнении уравнения деления является то, что вы не можете делить на ноль, не вызывая проблем. Очень немногие люди напишут 5 / 0, но вы можете не подумать, что размер чего-то в вашей системе иногда может быть нулевым, что может привести к ошибке такого типа.
ages.max / ages.min могли возвращать ошибку, если ages.max или ages.min были равны нулю.
Арифметические ошибки могут вызывать логические ошибки, как мы обсуждали, или даже ошибки времени выполнения в случае деления на ноль.
Наличие функциональных тестов, которые всегда включают крайние случаи, такие как ноль или отрицательные числа, — отличный способ остановить эти арифметические ошибки на своем пути.
6. Ошибки ресурсов
Компьютер, на котором установлена ваша программа, будет выделять фиксированное количество ресурсов для ее работы. Если что-то в вашем коде заставляет компьютер пытаться выделить больше ресурсов, чем у него есть, это может привести к ошибке ресурсов.
Если вы случайно написали цикл, из которого ваш код никогда не сможет выйти, у вас рано или поздно закончатся ресурсы. В этом примере цикл while будет продолжать добавлять новые элементы в массив. В конце концов у вас закончится память.
Ошибки, связанные с ресурсами, может быть трудно отследить, потому что машина, на которой вы разрабатываете, часто может быть более качественной, чем серверы, на которых выполняется ваш код. Также трудно имитировать реальное использование с вашего локального компьютера.
Хорошие отчеты об использовании ресурсов на ваших веб-серверах будут помечать код, который со временем потребляет слишком много ресурсов любого типа.
Ошибки ресурсов — это пример ошибки в программировании, которую может исправить операционная группа, а не разработчики.
Существует множество приложений и служб для нагрузочного тестирования, которые можно использовать для проверки того, что произойдет, когда несколько человек попытаются запустить ваш код одновременно. Затем вы можете настроить тестирование в соответствии с реалистичностью вашего приложения.
7. Ошибки интерфейса
Ошибки интерфейса возникают, когда существует несоответствие между тем, как вы хотели использовать свою программу, и тем, как она используется на самом деле. Большинство вещей в программном обеспечении соответствуют стандартам. Если входные данные, которые получает ваша программа, не соответствуют стандартам, вы можете получить ошибку интерфейса.
Например, ошибка интерфейса может произойти, если у вас есть API, требующий установки определенных параметров, а эти параметры не заданы.
Если ошибки интерфейса не обрабатываются должным образом, они будут выглядеть как ошибка на вашей стороне, когда это ошибка на стороне вызывающего абонента. Это может вызвать разочарование с обеих сторон.
Имея четкую документацию и отлавливая эти ошибки, чтобы передать их вызывающей стороне удобным способом, вы лучше всего скажете: "Эй, вы не предоставили нам то, что нам нужно для обработки этого запроса". Это поможет сократить расходы на поддержку и порадует ваших клиентов, потому что они знают, что им нужно исправить.
Если вы не отловите эти ошибки и не передадите их обратно вызывающей стороне, они в конечном итоге будут отображаться в отчетах как ошибки времени выполнения, и вы в конечном итоге будете чрезмерно защищаться от них.
Ошибки неизбежны
К счастью, мы уже давно не нуждаемся в правильном размещении перфокарт с первого раза. Разработка программного обеспечения сложна, требования часто размыты, а код часто меняется. Старайтесь не корить себя и знайте, что все мы совершаем ошибки.
Ошибки программирования неизбежны. Научитесь лучше замечать их на ранней стадии, но знайте, что вы никогда не будете идеальными.
Надеюсь, это руководство подготовило вас к различным типам ошибок в программировании и разъяснило некоторые наиболее распространенные сообщения об ошибках.
Если вы писали код в течение длительного времени, пожалуйста, прокомментируйте ниже некоторые ошибки, которые вы недавно допустили, чтобы успокоить людей, которые не писали код так долго!
Независимо от того, насколько вы умны или осторожны, ошибки — ваши постоянные спутники. С практикой вы станете немного лучше не делать ошибок и намного лучше находить и исправлять их.
Существует три типа ошибок: синтаксические ошибки, ошибки времени выполнения и логические ошибки.
Синтаксические ошибки
Это ошибки, когда компилятор находит что-то не так с вашей программой, и вы даже не можете попытаться ее выполнить. Например, у вас может быть неправильная пунктуация или вы пытаетесь использовать переменную, которая не была объявлена.
Синтаксические ошибки найти и исправить проще всего. Компилятор сообщит вам, где он попал в беду, и лучше всего догадается, что вы сделали не так. Обычно ошибка находится именно в строке, указанной компилятором, или в строке непосредственно перед ней; однако, если проблема заключается в неправильно вложенных фигурных скобках, фактическая ошибка может быть в начале вложенного блока.
Ошибки выполнения
Если синтаксических ошибок нет, Java может обнаружить ошибку во время работы вашей программы. Вы получите сообщение об ошибке, сообщающее о типе ошибки, и трассировку стека, которая сообщает не только о том, где произошла ошибка, но и о том, какой другой метод или методы вы применяли. Например,
здесь говорится, что NullPointerException было обнаружено в методе placeCarInCity в строке 25 в Car.java , который был вызван из конструктора для City в строке 38 в City.java , который был вызван из основного метода в строке 49 в City.java . Иногда будут дополнительные строки, описывающие методы в самой системе Java; вы можете игнорировать их.
Ошибки времени выполнения являются промежуточными по сложности. Java сообщает вам, где он обнаружил, что ваша программа пошла не так, но вам нужно вернуться оттуда, чтобы выяснить, где возникла проблема.
Логические ошибки
- Подумайте, что должна была сделать программа, чтобы получить нужные результаты. Это приведет вас туда, где должна была произойти ошибка.
- Добавьте операторы печати, чтобы понять, что на самом деле делает программа.
- Используйте отладчик, чтобы просмотреть программу и посмотреть, что она делает.
Возможно, вы слышали, что "глупых вопросов не бывает". Ну, умной ошибки не бывает. Почти все ошибки — глупые ошибки, которые вы можете распознать за секунду, как только вам на них укажут. И вы будете делать глупые ошибки в каждой написанной программе, независимо от того, сколько лет у вас опыта.
В результате новички часто стесняются показывать другим свои программы, опасаясь, что их сочтут глупыми.
Решение состоит в том, чтобы понять, что все остальные — все — совершают такие же глупые ошибки. Человек не способен избежать ошибок. С тем же успехом вам может быть стыдно, что у вас есть нос.
И хорошие программисты, и плохие программисты совершают глупые ошибки. Разница в том, что хорошие программисты:
В программе могут возникать разные виды ошибок, и полезно различать их, чтобы быстрее их отслеживать:
- Синтаксические ошибки создаются Python при переводе исходного кода в байтовый код. Обычно они указывают на то, что что-то не так с синтаксисом программы. Пример. Отсутствие двоеточия в конце оператора def приводит к несколько избыточному сообщению SyntaxError: invalidsyntax .
- Ошибки времени выполнения создаются системой выполнения, если что-то пойдет не так во время работы программы. Большинство сообщений об ошибках во время выполнения содержат информацию о том, где произошла ошибка и какие функции выполнялись. Пример: бесконечная рекурсия в конечном итоге приводит к ошибке времени выполнения, связанной с превышением максимальной глубины рекурсии.
- Семантические ошибки – это проблемы с программой, которая компилируется и запускается, но не выполняет правильную работу. Пример. Выражение может быть вычислено не в ожидаемом порядке, что приведет к неожиданному результату.
Первым шагом в отладке является определение типа ошибки, с которой вы имеете дело.Хотя следующие разделы организованы по типам ошибок, некоторые методы применимы более чем в одной ситуации.
Синтаксические ошибки¶
Синтаксические ошибки обычно легко исправить, если разобраться, в чем они заключаются. К сожалению, сообщения об ошибках часто бесполезны. Наиболее распространенными сообщениями являются SyntaxError: неверный синтаксис и SyntaxError: неверный токен , ни одно из которых не является очень информативным.
С другой стороны, в сообщении указано, в каком месте программы возникла проблема. На самом деле, он сообщает вам, где Python заметил проблему, что не обязательно является местом ошибки. Иногда ошибка предшествует местоположению сообщения об ошибке, часто в предыдущей строке.
Если вы строите программу поэтапно, у вас должно быть хорошее представление о том, где находится ошибка. Он будет в последней добавленной строке.
Если вы копируете код из книги, начните с очень тщательного сравнения своего кода с кодом книги. Проверьте каждый символ. В то же время помните, что книга может быть ошибочной, поэтому, если вы видите что-то похожее на синтаксическую ошибку, возможно, так оно и есть.
Вот несколько способов избежать наиболее распространенных синтаксических ошибок:
- Убедитесь, что вы не используете ключевое слово Python для имени переменной.
- Убедитесь, что у вас есть двоеточие в конце заголовка каждого составного оператора, включая for , while , if и < операторы tt>def.
- Проверьте соответствие отступов. Вы можете делать отступы с помощью пробелов или табуляции, но лучше не смешивать их. Каждый уровень должен быть вложен одинаково.
- Убедитесь, что все строки в коде заключены в соответствующие кавычки.
- Если у вас есть многострочные строки с тройными кавычками (одинарными или двойными), убедитесь, что вы правильно завершили строку. Незавершенная строка может вызвать ошибку invalid token в конце вашей программы, или она может рассматривать следующую часть программы как строку, пока не дойдет до следующей строки. Во втором случае сообщение об ошибке может вообще не появиться!
- Незакрытая скобка – (,
- Проверьте наличие классического = вместо == внутри условного оператора.
Если ничего не работает, перейдите к следующему разделу.
Я не могу запустить свою программу, что бы я ни делал.¶
Если компилятор сообщает об ошибке, а вы ее не видите, это может быть связано с тем, что вы и компилятор работаете с разными кодами. Проверьте свою среду программирования, чтобы убедиться, что программа, которую вы редактируете, является той, которую Python пытается запустить. Если вы не уверены, попробуйте поставить очевидную и преднамеренную синтаксическую ошибку в начале программы. Теперь запустите (или импортируйте) его снова. Если компилятор не находит новую ошибку, возможно, что-то не так с настройкой вашей среды.
В таком случае можно начать заново с новой программы, такой как Hello, World!, и убедиться, что вы можете запустить известную программу. Затем постепенно добавляйте кусочки новой программы к работающей.
Ошибки выполнения¶
После того, как ваша программа будет синтаксически правильной, Python может импортировать ее и, по крайней мере, начать ее выполнение. Что может пойти не так?
Моя программа абсолютно ничего не делает.¶
Эта проблема наиболее распространена, когда ваш файл состоит из функций и классов, но на самом деле ничего не вызывает для запуска выполнения. Это может быть сделано намеренно, если вы планируете импортировать этот модуль только для предоставления классов и функций.
Если это сделано непреднамеренно, убедитесь, что вы вызываете функцию для запуска выполнения, или выполните ее из интерактивной подсказки. См. также раздел «Поток выполнения» ниже.
Моя программа зависает.¶
Если программа останавливается и кажется, что ничего не делает, мы говорим, что она зависла. Часто это означает, что он попадает в бесконечный цикл или бесконечную рекурсию.
- Если есть определенный цикл, который, как вы подозреваете, является проблемой, добавьте оператор print непосредственно перед циклом, который говорит о входе в цикл, и еще один сразу после того, как говорит о выходе из цикла.
- Запустите программу. Если вы получаете первое сообщение, а не второе, у вас бесконечный цикл. Перейдите к разделу "Бесконечный цикл" ниже.
- Большую часть времени бесконечная рекурсия приводит к тому, что программа некоторое время работает, а затем выдает ошибку RuntimeError: Максимальная глубина рекурсии превышена. В этом случае перейдите к разделу «Бесконечная рекурсия» ниже.
- Если вы не получаете эту ошибку, но подозреваете, что проблема связана с рекурсивным методом или функцией, вы все равно можете использовать приемы, описанные в разделе "Бесконечная рекурсия".
- Если ни один из этих шагов не работает, начните тестирование других циклов и других рекурсивных функций и методов.
- Если это не сработает, возможно, вы не понимаете, как работает ваша программа. Перейдите к разделу «Поток выполнения» ниже.
Бесконечный цикл¶
Если вы думаете, что у вас бесконечный цикл, и вы думаете, что знаете, какой цикл вызывает проблему, добавьте оператор print в конце цикла, который печатает значения переменных в условии и значение условия.
Теперь, когда вы запускаете программу, вы увидите три строки вывода для каждого прохода цикла. В последний раз в цикле условие должно быть false . Если цикл продолжится, вы сможете увидеть значения x и y и понять, почему они не обновляются правильно.
Бесконечная рекурсия¶
В большинстве случаев бесконечная рекурсия приводит к тому, что программа некоторое время работает, а затем выдает ошибку Максимальная глубина рекурсии превышена.
Если вы подозреваете, что функция или метод вызывает бесконечную рекурсию, начните с проверки наличия базового случая. Другими словами, должно быть какое-то условие, которое заставит функцию или метод вернуться без рекурсивного вызова. Если нет, то вам нужно переосмыслить алгоритм и определить базовый вариант.
Если есть базовый вариант, но программа его не достигает, добавьте оператор print в начало функции или метода, который печатает параметры. Теперь, когда вы запускаете программу, вы будете видеть несколько строк вывода каждый раз, когда вызывается функция или метод, и вы увидите параметры. Если параметры не приближаются к базовому варианту, вы поймете, почему нет.
Поток выполнения¶
Если вы не уверены, как поток выполнения проходит через вашу программу, добавьте операторы print в начало каждой функции с сообщением, например, enter function foo , где foo — имя функции.
Теперь, когда вы запускаете программу, она будет печатать трассировку каждой функции по мере ее вызова.
Когда я запускаю программу, я получаю исключение.¶
Если во время выполнения что-то пойдет не так, Python напечатает сообщение, содержащее имя исключения, строку программы, в которой возникла проблема, и трассировку.
Трассировка идентифицирует функцию, которая выполняется в данный момент, затем функцию, вызвавшую ее, затем функцию, вызвавшую эту, и так далее. Другими словами, он отслеживает путь вызовов функций, которые привели вас туда, где вы находитесь. Он также включает номер строки в вашем файле, где происходит каждый из этих вызовов.
Первый шаг — изучить место в программе, где произошла ошибка, и посмотреть, сможете ли вы понять, что произошло. Вот некоторые из наиболее распространенных ошибок во время выполнения:
NameError Вы пытаетесь использовать переменную, которая не существует в текущей среде. Помните, что локальные переменные являются локальными. Вы не можете ссылаться на них вне функции, в которой они определены. Ошибка типа
Есть несколько возможных причин:
- Вы пытаетесь неправильно использовать значение. Пример: индексирование строки, списка или кортежа с помощью чего-то, кроме целого числа.
- Обнаружено несоответствие между элементами в строке формата и элементами, переданными для преобразования. Это может произойти, если количество элементов не совпадает или запрашивается недопустимая конверсия.
- Вы передаете неправильное количество аргументов функции или методу. Для методов посмотрите определение метода и убедитесь, что первым параметром является self. Затем посмотрите на вызов метода; убедитесь, что вы вызываете метод для объекта с правильным типом и правильно предоставляете другие аргументы.
Я добавил так много операторов print, что меня просто завалило выводом.¶
Одна из проблем с использованием операторов print для отладки заключается в том, что вы можете застрять в выводе. Есть два пути: упростить вывод или упростить программу.
Чтобы упростить вывод, вы можете удалить или закомментировать операторы print, которые не помогают, или объединить их, или отформатировать вывод, чтобы его было легче понять.
Чтобы упростить программу, вы можете сделать несколько вещей. Во-первых, уменьшите масштаб проблемы, над которой работает программа. Например, если вы сортируете массив, отсортируйте небольшой массив. Если программа получает ввод от пользователя, дайте ей самый простой ввод, который вызывает проблему.
Во-вторых, очистите программу. Удалите мертвый код и реорганизуйте программу, чтобы сделать ее максимально удобной для чтения. Например, если вы подозреваете, что проблема заключается в глубоко вложенной части программы, попробуйте переписать эту часть с более простой структурой. Если вы подозреваете большую функцию, попробуйте разделить ее на более мелкие функции и протестировать их по отдельности.
Часто поиск минимального теста приводит к ошибке. Если вы обнаружите, что программа работает в одной ситуации, но не работает в другой, это дает вам представление о том, что происходит.
Точно так же переписывание фрагмента кода может помочь вам найти незаметные ошибки. Если вы внесете изменение, которое, по вашему мнению, не повлияет на программу, а оно влияет, это может вас насторожить.
Семантические ошибки¶
В некотором смысле семантические ошибки труднее всего отлаживать, потому что компилятор и система среды выполнения не предоставляют информации о том, что не так. Только вы знаете, что программа должна делать, и только вы знаете, что она этого не делает.
Первый шаг — установить связь между текстом программы и поведением, которое вы видите. Вам нужна гипотеза о том, что на самом деле делает программа. Одна из причин, усложняющих это, заключается в том, что компьютеры работают очень быстро.
Вы часто будете хотеть замедлить программу до человеческой скорости, и с некоторыми отладчиками это возможно. Но время, затрачиваемое на вставку нескольких удачно размещенных операторов print, часто меньше времени, необходимого для настройки отладчика, вставки и удаления точек останова и перехода программы к месту возникновения ошибки.
Моя программа не работает.¶
Вы должны задать себе следующие вопросы:
- Есть ли что-то, что должна была сделать программа, но чего, похоже, не происходит? Найдите раздел кода, который выполняет эту функцию, и убедитесь, что он выполняется именно тогда, когда, по вашему мнению, должен.
- Происходит что-то, чего не должно быть? Найдите в своей программе код, который выполняет эту функцию, и посмотрите, выполняется ли он, когда не должен.
- Вызывает ли участок кода не тот эффект, на который вы рассчитывали? Убедитесь, что вы понимаете рассматриваемый код, особенно если он включает вызовы функций или методов в других модулях Python. Прочтите документацию по функциям, которые вы вызываете. Попробуйте их, написав простые тестовые примеры и проверив результаты.
Чтобы программировать, вам необходимо иметь представление о том, как работают программы. Если вы пишете программу, которая не делает того, что вы ожидаете, очень часто проблема не в программе; это в вашей ментальной модели.
Лучший способ исправить вашу ментальную модель — разбить программу на компоненты (обычно это функции и методы) и протестировать каждый компонент по отдельности. Как только вы обнаружите несоответствие между вашей моделью и реальностью, вы сможете решить проблему.
Конечно, вы должны создавать и тестировать компоненты по мере разработки программы. Если вы столкнулись с проблемой, должно быть только небольшое количество нового кода, о котором известно, что он правильный.
У меня большое волосатое выражение лица, и оно не соответствует моим ожиданиям.¶
Написание сложных выражений — это хорошо, если они удобочитаемы, но их сложно отлаживать. Часто бывает полезно разбить сложное выражение на ряд присваиваний временным переменным.
Это можно переписать так:
Явную версию легче читать, поскольку имена переменных предоставляют дополнительную документацию, и ее легче отлаживать, поскольку вы можете проверять типы промежуточных переменных и отображать их значения.
Еще одна проблема, которая может возникнуть с большими выражениями, заключается в том, что порядок вычисления может быть не таким, как вы ожидаете. Например, если вы переводите выражение x/2pi в Python, вы можете написать:
Это неверно, поскольку умножение и деление имеют одинаковый приоритет и вычисляются слева направо. Таким образом, это выражение вычисляет (x/2)pi .
Хорошим способом отладки выражений является добавление круглых скобок, чтобы сделать порядок вычислений явным:
Всякий раз, когда вы не уверены в порядке оценки, используйте круглые скобки. Мало того, что программа будет правильной (в смысле выполнения того, что вы задумали), она также будет более читабельной для других людей, которые не запомнили правила старшинства.
У меня есть функция или метод, который возвращает не то, что я ожидал.¶
Если у вас есть оператор return со сложным выражением, у вас нет возможности напечатать значение return перед возвратом. Опять же, вы можете использовать временную переменную. Например, вместо:
вы можете написать:
Теперь у вас есть возможность отобразить значение count перед возвратом.
Я действительно застрял, и мне нужна помощь.¶
Во-первых, попробуйте на несколько минут отойти от компьютера. Компьютеры излучают волны, воздействующие на мозг, вызывая следующие эффекты:
- Разочарование и/или гнев.
- Суеверные убеждения (компьютер меня ненавидит) и магическое мышление (программа работает только тогда, когда я надеваю шляпу задом наперед).
- Программирование со случайным блужданием (попытка запрограммировать, написав все возможные программы и выбрав ту, которая работает правильно).
Если вы обнаружите, что страдаете от любого из этих симптомов, встаньте и прогуляйтесь. Когда вы успокоитесь, подумайте о программе. Что он делает? Каковы возможные причины такого поведения? Когда в последний раз у вас была работающая программа, и что вы делали дальше?
Иногда требуется время, чтобы найти ошибку. Мы часто находим ошибки, когда находимся вдали от компьютера и позволяем нашим мыслям блуждать. Лучшими местами для поиска жуков являются поезда, душевые и кровати перед сном.
Нет, мне действительно нужна помощь.¶
Бывает. Даже лучшие программисты иногда застревают. Иногда работаешь над программой так долго, что не видишь ошибки. Свежий взгляд — это то, что нужно.
Прежде чем пригласить кого-то еще, убедитесь, что вы исчерпали описанные здесь приемы. Ваша программа должна быть максимально простой, и вы должны работать с наименьшими входными данными, вызывающими ошибку. У вас должны быть операторы print в соответствующих местах (и вывод, который они производят, должен быть понятным). Вы должны понимать проблему достаточно хорошо, чтобы кратко описать ее.
Когда вы приводите кого-то на помощь, обязательно предоставьте ему необходимую информацию:
- Если появляется сообщение об ошибке, что это такое и на какую часть программы оно указывает?
- Что вы сделали в последний раз перед тем, как возникла эта ошибка? Каковы были последние строки кода, которые вы написали, или какой новый тест не прошел?
- Что вы уже пробовали и чему научились?
Когда вы обнаружите ошибку, на секунду подумайте, что вы могли бы сделать, чтобы найти ее быстрее. В следующий раз, когда вы увидите нечто подобное, вы сможете быстрее найти ошибку.
Помните, что цель состоит не только в том, чтобы заставить программу работать. Цель состоит в том, чтобы узнать, как заставить программу работать.
Читайте также: