Исправьте ошибки в программе, чтобы программа выводила информацию, как указано в примере

Обновлено: 21.11.2024

Независимо от того, насколько вы умны или осторожны, ошибки — ваши постоянные спутники. С практикой вы станете немного лучше не делать ошибок и намного лучше находить и исправлять их.

Существует три типа ошибок: синтаксические ошибки, ошибки времени выполнения и логические ошибки.

Синтаксические ошибки

Это ошибки, когда компилятор находит что-то не так с вашей программой, и вы даже не можете попытаться ее выполнить. Например, у вас может быть неправильная пунктуация или вы пытаетесь использовать переменную, которая не была объявлена.

Синтаксические ошибки найти и исправить проще всего. Компилятор сообщит вам, где он попал в беду, и лучше всего догадается, что вы сделали не так. Обычно ошибка находится именно в строке, указанной компилятором, или в строке непосредственно перед ней; однако, если проблема заключается в неправильно вложенных фигурных скобках, фактическая ошибка может быть в начале вложенного блока.

Ошибки выполнения

Если синтаксических ошибок нет, Java может обнаружить ошибку во время работы вашей программы. Вы получите сообщение об ошибке, сообщающее о типе ошибки, и трассировку стека, которая сообщает не только о том, где произошла ошибка, но и о том, какой другой метод или методы вы применяли. Например,

здесь говорится, что NullPointerException было обнаружено в методе placeCarInCity в строке 25 в Car.java , который был вызван из конструктора для City в строке 38 в City.java , который был вызван из основного метода в строке 49 в City.java . Иногда будут дополнительные строки, описывающие методы в самой системе Java; вы можете игнорировать их.

Ошибки времени выполнения являются промежуточными по сложности. Java сообщает вам, где он обнаружил, что ваша программа пошла не так, но вам нужно вернуться оттуда, чтобы выяснить, где возникла проблема.

Логические ошибки

  • Подумайте, что должна была сделать программа, чтобы получить нужные результаты. Это приведет вас туда, где должна была произойти ошибка.
  • Добавьте операторы печати, чтобы понять, что на самом деле делает программа.
  • Используйте отладчик, чтобы просмотреть программу и посмотреть, что она делает.

Возможно, вы слышали, что "глупых вопросов не бывает". Ну, умной ошибки не бывает. Почти все ошибки — глупые ошибки, которые вы можете распознать за секунду, как только вам на них укажут. И вы будете делать глупые ошибки в каждой написанной программе, независимо от того, сколько лет у вас опыта.

В результате новички часто стесняются показывать другим свои программы, опасаясь, что их сочтут глупыми.

Решение состоит в том, чтобы понять, что все остальные — все — совершают такие же глупые ошибки. Человек не способен избежать ошибок. С тем же успехом вам может быть стыдно, что у вас есть нос.

И хорошие программисты, и плохие программисты совершают глупые ошибки. Разница в том, что хорошие программисты:

Обнаружение различных типов ошибок в программировании – важная часть процесса разработки. Лучшие разработчики легко ориентируются в ошибках, которые они создают, и быстро их исправляют.

Сегодня мы поговорим о семи наиболее распространенных типах ошибок программирования и о том, как их избежать.

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, требующий установки определенных параметров, а эти параметры не заданы.

Если ошибки интерфейса не обрабатываются должным образом, они будут выглядеть как ошибка на вашей стороне, когда это ошибка на стороне вызывающего абонента. Это может вызвать разочарование с обеих сторон.

Имея четкую документацию и отлавливая эти ошибки, чтобы передать их вызывающей стороне удобным способом, вы лучше всего скажете: "Эй, вы не предоставили нам то, что нам нужно для обработки этого запроса". Это поможет сократить расходы на поддержку и порадует ваших клиентов, потому что они знают, что им нужно исправить.

Если вы не отловите эти ошибки и не передадите их обратно вызывающей стороне, они в конечном итоге будут отображаться в отчетах как ошибки времени выполнения, и вы в конечном итоге будете чрезмерно защищаться от них.

Ошибки неизбежны

К счастью, мы уже давно не нуждаемся в правильном размещении перфокарт с первого раза. Разработка программного обеспечения сложна, требования часто размыты, а код часто меняется. Старайтесь не корить себя и знайте, что все мы совершаем ошибки.

Ошибки программирования неизбежны. Научитесь лучше замечать их на ранней стадии, но знайте, что вы никогда не будете идеальными.

Надеюсь, это руководство подготовило вас к различным типам ошибок в программировании и разъяснило некоторые наиболее распространенные сообщения об ошибках.

Если вы писали код в течение длительного времени, пожалуйста, прокомментируйте ниже некоторые ошибки, которые вы недавно допустили, чтобы успокоить людей, которые не писали код так долго!

Visual Studio предоставляет мощный интегрированный набор инструментов для сборки и отладки проектов. В этой статье вы узнаете, как Visual Studio может помочь вам найти проблемы в коде с помощью выходных данных сборки, анализа кода, инструментов отладки и модульных тестов.

Вы разобрались с редактором и создали код. Теперь вы хотите убедиться, что код работает правильно. В Visual Studio, как и в большинстве IDE, код работает в два этапа: создание кода для обнаружения и устранения ошибок проекта и компилятора и запуск кода для поиска ошибок времени выполнения и динамических ошибок.

Создайте свой код

Существует два основных типа конфигурации сборки: отладка и выпуск. Конфигурация отладки создает более медленный исполняемый файл большего размера, что обеспечивает более богатые интерактивные возможности отладки во время выполнения. Исполняемый файл отладки никогда не должен поставляться. Конфигурация Release создает более быстрый оптимизированный исполняемый файл, подходящий для поставки (по крайней мере, с точки зрения компилятора). Конфигурация сборки по умолчанию — отладка.

Самый простой способ собрать проект — нажать F7, но вы также можете начать сборку, выбрав в главном меню «Сборка» > «Сборка решения».

Вы можете наблюдать за процессом сборки в окне вывода в нижней части пользовательского интерфейса Visual Studio. Здесь отображаются ошибки, предупреждения и операции сборки. Если у вас есть ошибки (или если у вас есть предупреждения выше настроенного уровня), ваша сборка завершается ошибкой. Вы можете нажать на ошибки и предупреждения, чтобы перейти к строке, где они произошли. Пересоберите свой проект, либо снова нажав F7 (для перекомпиляции только файлов с ошибками), либо Ctrl+Alt+F7 (для чистого и полного перестроения).

В окне результатов под редактором есть два окна с вкладками: окно вывода, содержащее необработанные выходные данные компилятора (включая сообщения об ошибках); и окно Список ошибок, которое предоставляет сортируемый и фильтруемый список всех ошибок и предупреждений.

Если сборка прошла успешно, в окне вывода вы увидите такие результаты:

Просмотрите список ошибок

Если вы не вносили никаких изменений в код, который вы ранее успешно скомпилировали, возможно, у вас возникла ошибка. Если вы новичок в программировании, у вас, вероятно, их много. Ошибки иногда очевидны, например, простая синтаксическая ошибка или неправильное имя переменной, а иногда их трудно понять, и вам помогает только загадочный код. Чтобы получить более четкое представление о проблемах, перейдите в нижнюю часть окна вывода сборки и щелкните вкладку Список ошибок. Это позволит вам более организованно просмотреть ошибки и предупреждения для вашего проекта, а также предоставит вам некоторые дополнительные параметры.

Нажмите строку с ошибкой в ​​окне списка ошибок, чтобы перейти к строке, в которой возникла ошибка.(Или включите номера строк, нажав Ctrl+Q, введя номера строк, а затем выбрав Включить или отключить номера строк в результатах. Это самый быстрый способ открыть диалоговое окно «Параметры», в котором можно включить номера строк.)< /p>

Нажмите Ctrl+G, чтобы быстро перейти к номеру строки, где произошла ошибка.

Ошибка обозначается красной волнистой линией подчеркивания. Наведите указатель мыши на него, чтобы получить дополнительные сведения. Внесите исправление, и оно исчезнет, ​​хотя вы можете ввести новую ошибку с исправлением. (Это называется «регрессией».)

Просмотрите список ошибок и исправьте все ошибки в коде.

Подробно просмотреть ошибки

Многие ошибки могут не иметь для вас смысла, если они сформулированы в терминах компилятора. В таких случаях вам потребуется дополнительная информация. В окне Список ошибок вы можете выполнить автоматический поиск Bing для получения дополнительной информации об ошибке или предупреждении. Щелкните правой кнопкой мыши соответствующую строку ввода и выберите «Показать справку по ошибке» в контекстном меню или щелкните значение кода ошибки с гиперссылкой в ​​столбце «Код» списка ошибок.

В зависимости от ваших настроек либо ваш веб-браузер отображает результаты поиска кода и текста ошибки, либо в Visual Studio открывается вкладка, отображающая результаты поиска Bing. Результаты получены из разных источников в Интернете, и не все могут быть полезными.

Используйте анализ кода

Анализаторы кода ищут распространенные проблемы с кодом, которые могут привести к ошибкам во время выполнения или проблемам в управлении кодом.

Анализ кода C++

Чтобы проанализировать код C++, запустите статический анализ кода. Выработайте привычку запускать его после устранения очевидных ошибок, препятствующих успешной сборке, и потратьте некоторое время на устранение предупреждений, которые он может выдавать. Вы избавите себя от головной боли в будущем, и вы можете изучить несколько приемов стиля кода.

Нажмите Alt + F11 (или выберите "Анализ" > "Выполнить анализ кода решения" в верхнем меню), чтобы начать статический анализ кода.

Все новые или обновленные предупреждения отображаются на вкладке "Список ошибок" в нижней части IDE. Нажмите на предупреждения, чтобы перейти к ним в коде.

Используйте быстрые действия для исправления или рефакторинга кода

Быстрые действия можно использовать везде, где анализаторы кода определяют возможность исправления, рефакторинга или улучшения кода. Щелкните любую строку кода, щелкните правой кнопкой мыши, чтобы открыть контекстное меню, и выберите «Быстрые действия и рефакторинг». Если доступны параметры рефакторинга или улучшения, они отображаются. В противном случае в левом нижнем углу среды IDE отображается сообщение "Здесь нет доступных быстрых действий".

При наличии опыта вы сможете быстро использовать клавиши со стрелками и Ctrl+. чтобы проверить возможности простого рефакторинга и очистить свой код!

Запустить очистку кода

Помимо форматирования файла с учетом пробелов, отступов и т. д., Code Cleanup также применяет набор определяемых вами соглашений о стиле кода. Ваши настройки для каждого стиля кода считываются из файла EditorConfig, если он есть для проекта, или из настроек стиля кода в диалоговом окне «Параметры».

Отладка работающего кода

Теперь, когда вы успешно создали свой код и выполнили небольшую очистку, запустите его, нажав F5 или выбрав Отладка > Начать отладку. Это запустит ваше приложение в среде отладки, чтобы вы могли подробно наблюдать за его поведением. IDE Visual Studio изменяется во время работы вашего приложения: окно вывода заменяется двумя новыми (в конфигурации окна по умолчанию), окном с вкладками Autos/Locals/Watch и окном с вкладками Call Stack/Breakpoints/Exception Settings/Output. В этих окнах есть несколько вкладок, которые позволяют вам проверять и оценивать переменные, потоки, стеки вызовов и различные другие параметры вашего приложения во время его работы.

Остановите приложение, нажав Shift+F5 или нажав кнопку "Стоп". Или вы можете просто закрыть главное окно приложения (или диалоговое окно командной строки).

Если ваш код работал идеально и точно так, как вы ожидали, поздравляем! Однако, если он перестает отвечать на запросы, дает сбой или выдает какие-то странные результаты, вам необходимо найти источник этих проблем и исправить ошибки.

Установите простые точки останова

Точки останова — это основная и важная функция надежной отладки. Точка останова указывает, где Visual Studio должна приостановить выполнение вашего кода, чтобы вы могли посмотреть на значения переменных, или на поведение памяти, или на то, выполняется ли ветвь кода. Вам не нужно перестраивать проект после установки и удаления точек останова.

Установите точку останова, щелкнув дальний край строки, где вы хотите, чтобы произошел разрыв, или нажмите F9, чтобы установить точку останова на текущей строке кода. Когда вы запускаете свой код, он приостанавливается (или прекращается) до того, как будут выполнены инструкции для этой строки кода.

Общее использование точек останова включает:

Чтобы сузить источник сбоя или зависания программы, разбросайте точки останова по всему коду вызова метода, который, по вашему мнению, вызывает сбой. Когда вы запускаете код в отладчике, удаляйте, а затем сбрасывайте точки останова ближе друг к другу, пока не найдете строку кода, вызывающую нарушение. См. следующий раздел, чтобы узнать, как запускать код в отладчике.

При вводе нового кода установите в его начале точку останова и запустите код, чтобы убедиться, что он работает должным образом.

Если вы реализовали сложное поведение, установите точки останова для алгоритмического кода, чтобы вы могли проверять значения переменных и данных при остановке программы.

Если вы пишете код C или C++, используйте точки останова для остановки кода, чтобы вы могли проверять значения адресов (искать NULL) и счетчики ссылок при отладке сбоев, связанных с памятью.

Дополнительную информацию об использовании точек останова см. в разделе Использование точек останова.

Проверяйте свой код во время выполнения

Когда исполняемый код достигает точки останова и приостанавливается, это означает, что строка кода, отмеченная желтым цветом (текущий оператор), еще не выполнена. На этом этапе вы можете захотеть выполнить текущий оператор, а затем проверить измененные значения. Вы можете использовать несколько команд step для выполнения кода в отладчике. Если отмеченный код является вызовом метода, вы можете перейти к нему, нажав F11. Вы также можете перешагнуть строку кода, нажав F10. Дополнительные команды и сведения о пошаговом выполнении кода см. в статье Навигация по коду с помощью отладчика.

На предыдущем рисунке вы можете перейти на одну инструкцию отладчика, нажав клавишу F10 или F11 (поскольку здесь нет вызова метода, обе команды дают одинаковый результат).

Пока отладчик приостановлен, вы можете проверить свои переменные и стеки вызовов, чтобы определить, что происходит. Находятся ли значения в диапазонах, которые вы ожидаете увидеть? Звонки выполняются в правильном порядке?

Наведите указатель мыши на переменную, чтобы увидеть ее текущее значение и ссылки. Если вы видите значение, которого не ожидали, возможно, у вас есть ошибка в предшествующем или вызывающем коде. Чтобы получить более подробную информацию об отладке, узнайте больше об использовании отладчика.

Кроме того, Visual Studio отображает окно "Средства диагностики", в котором вы можете наблюдать за использованием ЦП и памяти вашего приложения с течением времени. Позже в процессе разработки приложения вы можете использовать эти инструменты для поиска непредвиденного интенсивного использования ЦП или выделения памяти. Используйте его в сочетании с окном наблюдения и точками останова, чтобы определить, что вызывает непредвиденное интенсивное использование или невысвобождение ресурсов. Дополнительную информацию см. в обзоре функций профилирования.

Выполнить модульные тесты

Модульные тесты — это ваша первая линия защиты от ошибок в коде, потому что при правильном выполнении они проверяют один «модуль» кода, обычно одну функцию, и их легче отлаживать, чем полную программу. Visual Studio устанавливает платформы модульного тестирования Microsoft как для управляемого, так и для машинного кода. Используйте среду модульного тестирования, чтобы создавать модульные тесты, запускать их и сообщать о результатах этих тестов. Повторно запускайте модульные тесты при внесении изменений, чтобы проверить, правильно ли работает ваш код. В редакции Visual Studio Enterprise вы можете автоматически запускать тесты после каждой сборки.

Чтобы узнать больше о модульных тестах в Visual Studio и о том, как они могут помочь вам создавать более качественный код, прочитайте статью Основы модульного тестирования.

С ошибками сталкивается каждый программист, как тот, кто только начинает, так и те, кто программирует годами. Столкновение с ошибками и исключениями может иногда сильно разочаровывать, и кодирование может казаться безнадежным занятием. Однако понимание того, какие существуют типы ошибок и когда вы, вероятно, столкнетесь с ними, может очень помочь. Как только вы узнаете, почему возникают определенные типы ошибок, их станет намного проще исправить.

Ошибки в Python имеют очень специфическую форму, называемую трассировкой. Давайте рассмотрим один:

Эта конкретная обратная трассировка имеет два уровня. Вы можете определить количество уровней, глядя на количество стрелок с левой стороны. В этом случае:

В первом показан код из ячейки выше со стрелкой, указывающей на строку 11 (фаворит_ice_cream() ).

Во втором показан код функции favourite_ice_cream со стрелкой, указывающей на строку 9 (то есть print(ice_creams[3])).

Последний уровень — это фактическое место, где произошла ошибка. Другие уровни показывают, какую функцию выполнила программа, чтобы перейти на следующий уровень вниз. Итак, в данном случае программа сначала выполнила вызов функции favourite_ice_cream. Внутри этой функции программа обнаружила ошибку в строке 6 при попытке запустить код print(ice_creams[3]) .

Длинные трассировки

Иногда вы можете увидеть очень длинную трассировку — иногда она может достигать даже 20 уровней! Из-за этого может показаться, что произошло что-то ужасное, но длина сообщения об ошибке не отражает ее серьезности, а скорее указывает на то, что ваша программа вызвала много функций, прежде чем столкнулась с ошибкой. В большинстве случаев фактическое место возникновения ошибки находится на самом нижнем уровне, поэтому вы можете пропустить трассировку до самого низа.

Так с какой же ошибкой на самом деле столкнулась программа? В последней строке трассировки Python услужливо сообщает нам категорию или тип ошибки (в данном случае это IndexError ) и более подробное сообщение об ошибке (в данном случае оно говорит «список индексов вне допустимого диапазона»).

Если вы столкнулись с ошибкой и не знаете, что она означает, все же важно внимательно прочитать трассировку. Таким образом, если вы исправляете ошибку, но сталкиваетесь с новой, вы можете сказать, что ошибка изменилась. Кроме того, иногда достаточно знать, где возникла ошибка, чтобы исправить ее, даже если вы не совсем понимаете сообщение.

Если вы столкнулись с неизвестной вам ошибкой, попробуйте просмотреть официальную документацию по ошибкам. Однако обратите внимание, что вы не всегда сможете найти там ошибку, так как можно создавать собственные ошибки. В этом случае мы надеемся, что пользовательское сообщение об ошибке будет достаточно информативным, чтобы помочь вам понять, что пошло не так.

Синтаксические ошибки

Если вы забудете двоеточие в конце строки, случайно добавите на один пробел больше, чем нужно при отступе под оператором if, или забудете круглую скобку, вы столкнетесь с синтаксической ошибкой. Это означает, что Python не смог понять, как читать вашу программу. Это похоже на забвение знаков препинания в английском языке: например, этот текст трудно читать, здесь нет знаков препинания, а также нет заглавных букв, почему это сложно, потому что вы должны выяснить, где заканчивается каждое предложение, вы также должны выяснить, где каждое предложение начинается в некоторой степени, может быть двусмысленно, должен ли быть разрыв предложения или нет

Обычно люди могут понять, что имеется в виду под текстом без знаков препинания, но люди гораздо умнее компьютеров. Если Python не умеет читать программу, он сдастся и сообщит вам об ошибке. Например:

Здесь Python сообщает нам, что в строке 1 есть ошибка SyntaxError, и даже ставит маленькую стрелку в том месте, где возникла проблема.В этом случае проблема заключается в том, что в определении функции отсутствует двоеточие в конце.

На самом деле в приведенной выше функции есть две проблемы с синтаксисом. Если мы исправим проблему с двоеточием, мы увидим, что также возникает ошибка IndentationError , что означает, что строки в определении функции не имеют одинакового отступа:

И SyntaxError, и IndentationError указывают на проблему с синтаксисом вашей программы, но ошибка IndentationError более конкретна: она всегда означает, что существует проблема с отступом в вашем коде.

Вкладки и пробелы

Некоторые ошибки отступов обнаружить труднее, чем другие. В частности, смешивание пробелов и табуляции может быть трудно обнаружить, потому что они оба являются пробелами. В примере ниже первые две строки в теле функции some_function имеют отступ табуляции, а третья строка — пробелы. Если вы работаете в блокноте Jupyter, обязательно скопируйте и вставьте этот пример, а не пытайтесь вводить его вручную, поскольку Jupyter автоматически заменяет табуляцию пробелами.

Визуально обнаружить ошибку невозможно. К счастью, Python не позволяет смешивать табуляции и пробелы.

Ошибки имени переменной

Другой очень распространенный тип ошибки называется NameError и возникает, когда вы пытаетесь использовать несуществующую переменную. Например:

Ошибки имени переменной сопровождаются одними из самых информативных сообщений об ошибках, которые обычно имеют вид «имя ‘имя_переменной’ не определено».

Почему появляется это сообщение об ошибке? На этот вопрос сложнее ответить, потому что он зависит от того, что должен делать ваш код. Однако есть несколько очень распространенных причин, по которым у вас может быть неопределенная переменная. Во-первых, вы хотели использовать строку, но забыли заключить ее в кавычки:

Вторая причина заключается в том, что вы, возможно, пытаетесь использовать переменную, которой еще не существует. В следующем примере count должен быть определен (например, с count = 0 ) перед циклом for:

Наконец, третья возможность заключается в том, что вы допустили опечатку при написании кода. Допустим, мы исправили ошибку выше, добавив строку Count = 0 перед циклом for. К сожалению, на самом деле это не исправляет ошибку. Помните, что переменные чувствительны к регистру, поэтому переменная count отличается от Count . Мы по-прежнему получаем ту же ошибку, потому что мы до сих пор не определили count :

Ошибки индекса

Далее следуют ошибки, связанные с контейнерами (такими как списки и строки) и элементами внутри них. Если вы попытаетесь получить доступ к несуществующему элементу списка или строке, вы получите сообщение об ошибке. В этом есть смысл: если вы спросите кого-нибудь, в какой день они хотели бы выпить кофе, и они ответят «в субботу», вы можете немного разозлиться. Python также раздражается, если вы пытаетесь запросить несуществующий элемент:

Здесь Python сообщает нам, что в нашем коде есть ошибка IndexError, означающая, что мы попытались получить доступ к несуществующему индексу списка.

Ошибки файлов

Последний тип ошибок, который мы сегодня рассмотрим, связан с чтением и записью файлов: FileNotFoundError . Если вы попытаетесь прочитать файл, который не существует, вы получите FileNotFoundError, сообщающий вам об этом. Если вы попытаетесь записать в файл, открытый только для чтения, Python 3 вернет UnsupportedOperationError. В более общем случае проблемы с вводом и выводом проявляются как ошибки IOError или OSError, в зависимости от используемой версии Python.

Одной из причин появления этой ошибки является то, что вы указали неверный путь к файлу. Например, если я сейчас нахожусь в папке с именем myproject и у меня есть файл в myproject/writing/myfile.txt, но я пытаюсь открыть myfile.txt, это не удастся. Правильный путь будет писать/myfile.txt. Также возможно, что имя файла или его путь содержат опечатку.

Связанная проблема может возникнуть, если вы используете флаг «чтение» вместо флага «запись». Python не выдаст вам ошибку, если вы попытаетесь открыть файл для записи, когда файл не существует. Однако, если вы хотели открыть файл для чтения, но случайно открыли его для записи, а затем попытаетесь прочитать из него, вы получите ошибку UnsupportedOperation, говорящую о том, что файл не был открыт для чтения:

Это наиболее распространенные ошибки с файлами, хотя существует и множество других. Если вы столкнулись с ошибкой, которую вы никогда раньше не видели, поиск в Интернете по этому типу ошибки часто позволяет выявить распространенные причины, по которым вы можете получить эту ошибку.

Чтение сообщений об ошибках

  1. Сколько уровней имеет трассировка?
  2. Как называется функция, в которой произошла ошибка?
  3. В какой строке этой функции возникла ошибка?
  4. Какой тип ошибки?
  5. Что такое сообщение об ошибке?

Решение

  1. 3 уровня
  2. print_message
  3. 11
  4. Ошибка ключа
  5. На самом деле сообщения нет; вы должны сделать вывод, что пятница не является ключевой в сообщениях .

Выявление синтаксических ошибок

  1. Прочитайте приведенный ниже код и (не запуская его) попытайтесь определить, в чем заключаются ошибки.
  2. Запустите код и прочитайте сообщение об ошибке. Это SyntaxError или IndentationError?
  3. Исправьте ошибку.
  4. Повторяйте шаги 2 и 3, пока не исправите все ошибки.

Решение

SyntaxError для отсутствия (): в конце первой строки, IndentationError для несоответствия между второй и третьей строками. Исправленная версия:

Выявление ошибок в именах переменных

  1. Прочитайте приведенный ниже код и (не запуская его) попытайтесь определить, в чем заключаются ошибки.
  2. Запустите код и прочитайте сообщение об ошибке. Как вы думаете, какой это тип NameError? Другими словами, это строка без кавычек, переменная с ошибкой или переменная, которая должна была быть определена, но не была определена?
  3. Исправьте ошибку.
  4. Повторяйте шаги 2 и 3, пока не исправите все ошибки.

Решение

3 ошибки NameError для номера с ошибкой, для сообщения, которое не определено, и для отсутствия в кавычках.

Исправленная версия:

Выявление ошибок индекса

  1. Прочитайте приведенный ниже код и (не запуская его) попытайтесь определить, в чем заключаются ошибки.
  2. Запустите код и прочитайте сообщение об ошибке. Что это за ошибка?
  3. Исправьте ошибку.

Решение

Ошибка индекса ; последняя запись — Seasons[3] , так что Seasons[4] не имеет смысла. Исправленная версия:

Читайте также: