Синтаксические ошибки и исключения
Синтаксические ошибки и исключения
До сих пор мы старались писать правильный код. Но ошибки — неизбежная часть программирования, и умение с ними работать так же важно, как умение писать правильный код. 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 и писать код, который корректно обрабатывает ошибки вместо того, чтобы падать.