Ошибки и исключения в Python

PythonBeginner
Практиковаться сейчас

Введение

В этой лабораторной работе вы получите практическое понимание ошибок (errors) и исключений (exceptions) в Python. Мы рассмотрим, как идентифицировать распространенные синтаксические ошибки, которые препятствуют выполнению кода, распознавать различные типы исключений, возникающих во время выполнения (runtime), и четко различать эти две фундаментальные концепции в программировании на Python.

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

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

Определение синтаксических ошибок

На этом шаге мы рассмотрим распространенные синтаксические ошибки (Syntax Errors) в Python. Синтаксические ошибки возникают, когда код нарушает грамматические правила языка, что не позволяет интерпретатору понять и выполнить код. Эти ошибки обнаруживаются еще до того, как программа начнет выполняться.

Необходимый файл syntax_errors.py уже создан для вас в директории ~/project.

Сначала рассмотрим IndentationError (ошибку отступа). Откройте syntax_errors.py с помощью файлового обозревателя в левой части WebIDE. Добавьте следующий код, который содержит некорректный отступ:

for i in range(5):
    print(i)
  print("This line has incorrect indentation")

Сохраните файл. Теперь откройте интегрированный терминал и запустите скрипт:

python syntax_errors.py

Вы увидите IndentationError. Интерпретатор Python ожидает, что блоки кода (например, внутри цикла for) будут иметь согласованный уровень отступа.

  File "/home/labex/project/syntax_errors.py", line 3
    print("This line has incorrect indentation")
                                                ^
IndentationError: unindent does not match any outer indentation level

Теперь исправим отступ, но внесем другой тип SyntaxError. Измените код в syntax_errors.py на следующий. Обратите внимание на отсутствующую двоеточие (:) в конце первой строки.

for i in range(5)
    print(i)
    print("This line has correct indentation")

Сохраните файл и снова запустите его из терминала:

python syntax_errors.py

На этот раз вы получите SyntaxError. Инструкция цикла for в Python требует двоеточия в конце для обозначения начала блока кода.

  File "/home/labex/project/syntax_errors.py", line 1
    for i in range(5)
                     ^
SyntaxError: expected ':'

Наконец, исправим двоеточие, но внесем другую распространенную SyntaxError: незавершенную строку (unterminated string). Измените файл syntax_errors.py следующим образом. Строка "hello' начинается с двойной кавычки, но заканчивается одинарной.

for i in range(5):
    print("hello')

Сохраните файл и запустите его:

python syntax_errors.py

Вы столкнетесь с SyntaxError, потому что строка не была корректно закрыта соответствующей кавычкой.

  File "/home/labex/project/syntax_errors.py", line 2
    print("hello')
          ^
SyntaxError: unterminated string literal (detected at line 2)

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

Распознавание распространенных исключений

На этом шаге мы рассмотрим распространенные исключения (exceptions). В отличие от синтаксических ошибок, исключения возникают во время выполнения программы (runtime). Код синтаксически корректен, но ошибка происходит в процессе его работы.

Файл common_exceptions.py готов для вас в директории ~/project.

Сначала вызовем ZeroDivisionError (ошибку деления на ноль). Откройте common_exceptions.py в редакторе и добавьте следующий код:

numerator = 10
denominator = 0
result = numerator / denominator
print(result)

Сохраните файл и запустите его из терминала:

python common_exceptions.py

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

Traceback (most recent call last):
  File "/home/labex/project/common_exceptions.py", line 3, in <module>
    result = numerator / denominator
ZeroDivisionError: division by zero

Далее, спровоцируем NameError. Это происходит, когда вы пытаетесь использовать переменную, которая еще не была определена. Замените содержимое common_exceptions.py следующим:

print(undefined_variable)

Сохраните файл и запустите его:

python common_exceptions.py

Вы получите NameError, потому что интерпретатор не знает, на что ссылается undefined_variable.

Traceback (most recent call last):
  File "/home/labex/project/common_exceptions.py", line 1, in <module>
    print(undefined_variable)
NameError: name 'undefined_variable' is not defined

Теперь посмотрим на TypeError. Это происходит, когда вы пытаетесь выполнить операцию над объектом неподходящего типа. Замените содержимое common_exceptions.py этим кодом:

print("Hello" + 5)

Сохраните и запустите скрипт:

python common_exceptions.py

Вы увидите TypeError. Python не позволяет напрямую складывать строку (str) и целое число (int).

Traceback (most recent call last):
  File "/home/labex/project/common_exceptions.py", line 1, in <module>
    print("Hello" + 5)
TypeError: can only concatenate str (not "int") to str

Наконец, продемонстрируем IndexError. Это происходит, когда вы пытаетесь получить доступ к элементу последовательности (например, списка) по индексу, который выходит за допустимые границы. Замените содержимое common_exceptions.py следующим:

my_list = [1, 2, 3]
print(my_list[5])

Сохраните и запустите скрипт:

python common_exceptions.py

Вы получите IndexError. Список my_list содержит три элемента, поэтому допустимые индексы — 0, 1 и 2. Доступ по индексу 5 невозможен.

Traceback (most recent call last):
  File "/home/labex/project/common_exceptions.py", line 2, in <module>
    print(my_list[5])
IndexError: list index out of range

Понимание этих распространенных исключений является ключевой частью обучения отладке кода на Python.

Различение ошибок (Errors) и исключений (Exceptions)

На этом заключительном шаге мы четко разграничим синтаксические ошибки (syntax errors) и исключения (exceptions). Это различие фундаментально для программирования и отладки на Python.

Синтаксические ошибки (или ошибки парсинга):

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

Исключения (или ошибки времени выполнения — Runtime Errors):

  • Эти ошибки возникают во время выполнения синтаксически корректной программы.
  • Они случаются, когда программа сталкивается с непредвиденной ситуацией, например, делением на ноль или попыткой доступа к несуществующему файлу.
  • Если исключение не обработано, оно приведет к аварийному завершению программы и выводу трассировки стека (traceback).
  • Примеры: ZeroDivisionError, NameError, TypeError, IndexError.

Посмотрим на это в действии. Откройте файл error_vs_exception.py в файловом обозревателе. Добавьте следующий код, который содержит как синтаксическую ошибку (пропущенное двоеточие), так и строку, которая вызовет исключение времени выполнения.

## This line has a syntax error (missing colon)
for i in range(5)
    print(i)

## This line will cause an exception (division by zero)
result = 10 / 0
print(result)

Сохраните файл и попытайтесь его запустить:

python error_vs_exception.py

Обратите внимание, что вы немедленно получаете SyntaxError. Интерпретатор проверяет весь файл на корректность синтаксиса, прежде чем начать выполнение какой-либо его части. Он находит пропущенное двоеточие и останавливается, даже не доходя до строки с 10 / 0.

  File "/home/labex/project/error_vs_exception.py", line 2
    for i in range(5)
                     ^
SyntaxError: expected ':'

Теперь исправим синтаксическую ошибку. Добавьте пропущенное двоеточие в строку цикла for в error_vs_exception.py:

## The syntax error is now fixed
for i in range(5):
    print(i)

## This line will cause an exception (division by zero)
result = 10 / 0
print(result)

Сохраните файл и запустите его снова:

python error_vs_exception.py

На этот раз программа синтаксически корректна, поэтому она начинает выполняться. Цикл for выполняется и выводит числа от 0 до 4. Затем, когда программа пытается выполнить result = 10 / 0, она сталкивается с проблемой времени выполнения и вызывает ZeroDivisionError, что приводит к аварийному завершению программы.

0
1
2
3
4
Traceback (most recent call last):
  File "/home/labex/project/error_vs_exception.py", line 6, in <module>
    result = 10 / 0
ZeroDivisionError: division by zero

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

Резюме

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

Далее вы рассмотрели несколько распространенных исключений времени выполнения (runtime exceptions), включая ZeroDivisionError, NameError, TypeError и IndexError. Вы увидели, как эти исключения возникают в синтаксически корректном коде, когда операция завершается неудачей во время выполнения. Наконец, вы закрепили свое понимание, наблюдая, как интерпретатор Python обрабатывает файл, содержащий как синтаксическую ошибку, так и потенциальное исключение, что доказывает, что синтаксис проверяется до начала выполнения. Эти знания служат важнейшей основой для написания и отладки приложений на Python.