Руководство по исправлению ошибок программирования в Python

Программирование предполагает множество ошибок — даже для опытных программистов.

Незнание того, как исправить ошибку, расстраивает и демотивирует, особенно новичков.

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

Что такое ошибка?

Простое определение: ошибка — это проблема в программе, препятствующая ее продолжению.

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

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

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

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

Давайте посмотрим на некоторые примеры ошибок, с которыми я имел дело в последнее время, и как я их исправил.

Ошибка чтения данных

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

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

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

Здесь у нас есть воображаемый набор данных, который я безуспешно пытаюсь прочитать:

df = pd.read_csv('input/imaginary_messy_dataset.csv')

Первое, что я делаю здесь, это проверяю самую последнюю строку сообщения трассировки — и копирую и вставляю все это в Google.

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

Первый результат выглядит многообещающе!

Похоже, автор вопроса столкнулся с проблемой, очень похожей на нашу. Они спрашивают: «Почему элемент ниже не работает? . . ».

Первый ответ предлагает добавить encoding='latin-1' в наш код, и ответ включает в себя фрагмент кода, очень удобный для чтения в файле csv с помощью Pandas, точно так же, как мы пытаемся сделать здесь. Давайте попробуем обновить наш код с предложением этого ответа:

df = pd.read_csv('input/imaginary_messy_dataset.csv', encoding='latin-1')

Программа выполняется без ошибок! Мы успешно исправили эту ошибку!

Советы и рекомендации по поиску в Google

В приведенном выше примере мы скопировали и вставили всю последнюю строку сообщения трассировки в Google. Хотя в этом примере это сработало идеально, это не всегда так.

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

В нашем примере проблема возникла в позиции 27. Это очень характерно для нашей уникальной ошибки.

## entire last line of traceback
unicodedecodeerror: 'utf-8' codec can't decode byte 0xca in position 27: invalied continuation byte

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

### error message with some specifics removed
unicodedecodeerror: 'utf-8' codec can't decode byte invalied continuation byte

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

Дополнительные ошибки при чтении данных

UnicodeDecodeError — одна из менее распространенных ошибок, с которыми я сталкиваюсь.

Давайте рассмотрим некоторые более распространенные проблемы, которые могут возникнуть при чтении файла.

Здесь мы снова пытаемся прочитать в нашем файле:

Хотя это сообщение об ошибке намного короче, чем в предыдущем примере, я по-прежнему сначала смотрю на последнюю строку.

Здесь у нас есть NameError с сообщением name 'pd' is not defined.

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

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

Здесь мы пытаемся использовать Pandas и еще не импортировали его.

import pandas as pd
df = pd.read_csv('input/imaginary_messy_dataset.csv')

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

Еще больше ошибок чтения данных

Здесь мы пытаемся прочитать в том же файле и получаем еще одну ошибку:

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

Здесь у нас есть FileNotFoundError: [Errno 2] No such file or directory: ‘input/imaginary_messy_dataset.csv’

Это говорит нам о том, что в папке input нет файла imaginary_messy_dataset.csv. Теперь нам просто нужно выяснить, почему мы получаем это сообщение.

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

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

Заключение

Ошибки — ежедневное явление в программировании. Здесь мы рассмотрели различные сообщения об ошибках и разобрались, как их расшифровать и исправить.

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

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

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

Удачной обработки ошибок!

Дополнительные материалы на PlainEnglish.io.

Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .

Заинтересованы в масштабировании запуска вашего программного обеспечения? Ознакомьтесь с разделом Схема.