Исключения в Python: try, except и raise с нуля — интерактивный курс (20 уроков)
Программа падает красиво: лови, бросай и создавай свои исключения
Редакция Питоники

Ошибка — это не крах программы, а сообщение с именем. Исключение можно поймать, разобрать, выбросить своё и даже построить из него цепочку. Программы, которые переживают плохой ввод, недоступный файл и пустой словарь, написаны именно на try/except.
Двадцать уроков ведут от первого traceback до уверенной обработки: try и except, конкретные типы (ValueError, KeyError, TypeError, FileNotFoundError), as e для текста ошибки, else и finally, raise для своих правил, повторное возбуждение, иерархия исключений, свои классы исключений, EAFP против LBYL, цепочки raise from — и финальный проект: надёжный парсер файла, который переживает грязные данные.
Каждый блок исполняется в браузере: видно и правильную обработку, и настоящую ошибку — со сравнением вывода.
Чему научитесь
- Читать traceback и находить причину ошибки
- Ловить исключения через try и except
- Ловить конкретные типы: ValueError, KeyError, TypeError
- Получать объект ошибки через as e
- Использовать else и finally по назначению
- Бросать исключения через raise
- Повторно возбуждать исключение без потери стека
- Разбираться в иерархии исключений
- Создавать свои классы исключений
- Писать код в стиле EAFP
Для кого: Тем, кто уже писал код и видел traceback: курс учит не бояться красных сообщений, а управлять ими.
- Урок 1. Что такое исключение: первая ошибка в программеПервая ошибка в программе: читаем traceback за десять секунд — тип ошибки, место и сообщение. Разбираем четыре типовых падения на живом коде.15 мин
- Урок 2. try и except: ловим ошибку и не падаемПервый запасной план: try держит рискованный код, except — что делать, если он упал. Прыжки, пропуски и try внутри цикла — на живом коде.15 мин
- Урок 3. except ValueError: ловим конкретный тип ошибкиУточняем обработчик: except ValueError ловит только свой тип ошибок. Почему голый except прячет опечатки и как ValueError ведёт себя у int и list.remove.15 мин
- Урок 4. Несколько except: разные ошибки — разные реакцииЦепочка except-блоков: ValueError — один план, ZeroDivisionError — другой. Порядок обработчиков, правило одного обработчика и кортеж типов.16 мин
- Урок 5. as e: объект ошибки в переменнойОбработчик узнаёт больше, если взять ошибку в переменную: except ValueError as e даёт тип, сообщение и аргументы исключения.15 мин
- Урок 6. else и finally: два хвоста tryДва хвоста try: else работает при успехе, finally — при любом исходе. Разбираем порядок try, except, else, finally и место каждого блока.16 мин
- Урок 7. raise: бросаем исключение самиДо сих пор ошибки бросал Python. Теперь научимся бросать сами: raise ValueError с понятным текстом, когда данные нарушают правила программы.15 мин
- Урок 8. Повторное возбуждение: голый raise в exceptИсключение поймано, но проблема не решена: голый raise внутри except передаёт её наверх, не теряя стек. Учимся честному пробросу и ловим RuntimeError от raise вне except.15 мин
- Урок 9. Иерархия исключений Python: кто чей родительZeroDivisionError, KeyError, FileNotFoundError — не набор случайных имён, а семейное дерево. Разбираемся, кто чей родитель и почему ловля родителя ловит детей.15 мин
- Урок 10. Свои исключения в Python: класс от ExceptionValueError говорит «что-то не то», но не «какое правило нарушено». Заводим свои классы исключений: внятное имя в логах, свои атрибуты и целые семейства ошибок.15 мин
- Урок 11. KeyError в Python: ошибки словарейСловарь не нашёл ключ — и честно сказал об этим KeyError. Разбираем объект ошибки, читаем из него ключ и выбираем между get, in и честным исключением.15 мин
- Урок 12. ValueError в Python: разбор строк в числаint('восемнадцать') — тип подходящий, а значение не помещается. Разбираем сообщение invalid literal, границы int и float и честную проверку isdigit.15 мин
- Урок 13. FileNotFoundError в Python: файл не нашёлсяopen('нет-такого-файла.txt') — и программа падает. Ловим FileNotFoundError, читаем имя файла из объекта ошибки и создаём файлы прямо в примерах.15 мин
- Урок 14. EAFP против LBYL в Python: два стиля проверкиLook Before You Leap — смотри, прежде чем прыгнуть; Easier to Ask Forgiveness than Permission — проще извиниться, чем спросить. Одна задача, два стиля, один вердикт.15 мин
- Урок 15. except Exception в Python: когда ловить всё и чем это грозитОдна строка вместо перечня типов: except Exception ловит почти всё. Разбираем слепую зону перехвата, спрятанные баги и место, где широкая сетка уместна по-настоящему.15 мин
- Урок 16. Ошибки в цикле Python: try внутри for и продолжение после сбояСто строк данных, одна битая — и без защиты падает весь проход. Ставим try вокруг одного элемента: сбой обрабатывается, цикл идёт дальше, сбои считаются и попадают в журнал.16 мин
- Урок 17. raise from в Python: цепочка причин, __cause__ и __context__Обработчик превращает чужую ошибку в свою — а куда девается первоначальная? Python хранит её в цепочке: raise from e помечает причину явно, from None прячет её сознательно.15 мин
- Урок 18. assert в Python: проверки для разработчика и AssertionErrorassert — это заявление: здесь должно быть так. Провал превращается в AssertionError с вашим сообщением, а флаг -O умеет вырезать все проверки разом — поэтому инструмент разработчика, а не валидатор ввода.15 мин
- Урок 19. except или if в Python: граница применимости проверки и исключенияОтсутствие ключа: проверить if-ом или поймать KeyError? Разбираем честную границу: обычные варианты — if, редкие сбои — except, и случай, где проверка проигрывает исключению всухую.16 мин
- Урок 20. Проект: надёжный разбор файла с грязными данными в PythonИтоговый проект: файл с мусором — пустые строки, слова вместо чисел, пробелы — не роняет отчёт, а попадает в журнал. Три куска: построчный разбор, счётчики с первыми ошибками и функция-парсер со сверкой.30 мин