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

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

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

Два вида ошибок в Python

Синтаксическая ошибка (SyntaxError) — Python не может даже начать выполнять программу, потому что код нарушает правила языка. Она обнаруживается при разборе файла, до запуска:

# SyntaxError — пропущены двоеточия, неправильный оператор:
if x > 0
    print("positive")   # SyntaxError: expected ':'

print("hello"           # SyntaxError: '(' was never closed

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

Исключение (Exception) — ошибка возникает во время выполнения. Синтаксически код правильный, но что-то пошло не так при запуске:

x = int("не число")     # ValueError
y = 10 / 0              # ZeroDivisionError
z = [1, 2, 3][10]      # IndexError

Исключения можно перехватывать и обрабатывать — именно для этого существует try/except.

Иерархия встроенных исключений

Python имеет богатую иерархию исключений. Вот самые частые:

BaseException
 └── Exception
      ├── ValueError     — неправильное значение (int("abc"))
      ├── TypeError      — неправильный тип (1 + "2")
      ├── IndexError     — индекс вне диапазона ([1,2,3][5])
      ├── KeyError       — ключ не найден в словаре (d["missing"])
      ├── AttributeError — атрибут не существует ("str".nonexistent)
      ├── NameError      — имя не определено (print(undefined_var))
      ├── ZeroDivisionError — деление на ноль
      ├── FileNotFoundError — файл не найден
      ├── ImportError    — модуль не найден
      └── StopIteration  — конец итератора

Как читать трейсбек

Когда Python выбрасывает необработанное исключение, он выводит трейсбек (traceback) — цепочку вызовов до места ошибки:

Traceback (most recent call last):
  File "app.py", line 7, in <module>
    result = divide(10, 0)
  File "app.py", line 3, in divide
    return a / b
ZeroDivisionError: division by zero

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

Частые исключения и их причины

# ValueError — правильный тип, неправильное значение:
int("abc")          # ValueError: invalid literal for int() with base 10: 'abc'
int("3.14")         # ValueError: тоже — нельзя строку с точкой

# TypeError — операция неприменима к типу:
"hello" + 5         # TypeError: can only concatenate str (not "int") to str
len(42)             # TypeError: object of type 'int' has no len()

# KeyError — ключа нет в словаре:
d = {"a": 1}
d["b"]              # KeyError: 'b'
# Безопасно: d.get("b") → None

# IndexError — индекс вне диапазона:
lst = [1, 2, 3]
lst[5]              # IndexError: list index out of range

Проверь себя

Какое исключение вызовет следующий код и почему?

name = "Алиса"
age = name[100]

IndexError — строка "Алиса" содержит 5 символов (индексы 0–4), а name[100] обращается к несуществующему индексу 100.

Итог

  • SyntaxError — нарушение правил синтаксиса; исправляется в коде, не перехватывается.
  • Exception — ошибка выполнения; можно перехватить и обработать.
  • Трейсбек читается снизу вверх: последняя строка — тип ошибки и описание.
  • Частые исключения: ValueError, TypeError, IndexError, KeyError, ZeroDivisionError.
  • Исключения образуют иерархию; конкретные исключения — потомки Exception.

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

Попробуйте интерактивную версию

Практические задачи, квизы и AI-наставник — бесплатный старт без карты

Перейти к практике