/
disciplina
/
stepik-python-debugging
Обзор
Документация
Войти
/
disciplina
/
stepik-python-debugging
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
lessons/module1/1.2/lesson1.step
18 строк
7 KB
Sergey
Вторая версия курса
27 янв 2026, 21:14
27 янв 2026, 21:14
79b9655
Код
Авторство
О чём код?
{ "block": { "name": "text", "text": "<h2>Исключения в Python</h2>\n\n<p>В Python <strong>все исключения являются экземплярами классов</strong>, которые наследуются от базового класса <code>BaseException</code>. Понимание системы исключений критически важно для эффективной отладки программ.</p>\n\n<h3>Основные принципы работы с исключениями</h3>\n\n<h4>1. Наследование исключений</h4>\n<p>Блок <code>except</code>, обрабатывающий определённый класс исключения, также обрабатывает все исключения, унаследованные от этого класса.</p>\n\n<p><strong>Пример:</strong></p>\n<pre><code>try:\n # код, который может вызвать ошибку\n result = 10 / 0\nexcept ArithmeticError: # Поймает ZeroDivisionError\n print(\"Арифметическая ошибка!\")</code></pre>\n\n<h4>2. Связанные значения (Associated Values)</h4>\n<p>Каждое исключение несёт <strong>связанное значение</strong>, которое указывает на причину ошибки. Обычно это строка или кортеж с информацией, переданной в конструктор класса исключения.</p>\n\n<pre><code>raise ValueError(\"Недопустимое значение: -5\")</code></pre>\n\n<h4>3. Пользовательские исключения</h4>\n<p>Все пользовательские исключения должны наследоваться от класса <code>Exception</code> или его подклассов, <strong>но не от <code>BaseException</code> напрямую</strong>.</p>\n\n<pre><code>class MyCustomError(Exception):\n \"\"\"Пользовательское исключение для моего приложения\"\"\"\n pass\n\nraise MyCustomError(\"Что-то пошло не так\")</code></pre>\n\n<h3>Контекст исключений</h3>\n\n<p>Python автоматически отслеживает контекст возникновения исключений с помощью трёх специальных атрибутов:</p>\n\n<table>\n<tr>\n<th>Атрибут</th>\n<th>Описание</th>\n</tr>\n<tr>\n<td><code>__context__</code></td>\n<td>Автоматически устанавливается при возникновении исключения во время обработки другого исключения</td>\n</tr>\n<tr>\n<td><code>__cause__</code></td>\n<td>Явная причина исключения, устанавливается через <code>raise ... from ...</code></td>\n</tr>\n<tr>\n<td><code>__suppress_context__</code></td>\n<td>Управляет отображением неявного контекста</td>\n</tr>\n</table>\n\n<h4>Явное указание причины</h4>\n<pre><code>try:\n # код, который вызывает ошибку\n x = int(\"не число\")\nexcept ValueError as e:\n # Создаём новое исключение с указанием причины\n raise TypeError(\"Ошибка преобразования\") from e</code></pre>\n\n<p>При использовании <code>raise ... from ...</code>:</p>\n<ul>\n<li>Устанавливается атрибут <code>__cause__</code></li>\n<li>Автоматически устанавливается <code>__suppress_context__ = True</code></li>\n<li>В traceback отображается явная цепочка причин</li>\n</ul>\n\n<h3>Базовые классы исключений</h3>\n\n<h4>BaseException</h4>\n<p>Корневой класс для всех исключений. <strong>Не наследуйте от него напрямую!</strong> Он используется только для системных исключений.</p>\n\n<h4>Exception</h4>\n<p>Базовый класс для всех <strong>несистемных</strong> исключений. Все пользовательские исключения должны наследоваться от него.</p>\n\n<h3>Зачем нужна иерархия исключений?</h3>\n\n<p>Иерархическая структура позволяет:</p>\n\n<ol>\n<li><strong>Гибко обрабатывать ошибки</strong> — можно ловить как специфичные исключения, так и целые категории</li>\n<li><strong>Создавать логические группы</strong> — например, все арифметические ошибки наследуются от <code>ArithmeticError</code></li>\n<li><strong>Избежать случайного перехвата системных исключений</strong> — отделение <code>Exception</code> от <code>BaseException</code></li>\n<li><strong>Упростить обработку</strong> — один обработчик может поймать несколько связанных типов ошибок</li>\n</ol>\n\n<h3>Лучшие практики</h3>\n\n<ul>\n<li>✅ Наследуйтесь от <code>Exception</code>, а не от <code>BaseException</code></li>\n<li>✅ Используйте <code>raise ... from ...</code> для явного указания причины</li>\n<li>✅ Перехватывайте конкретные исключения, а не общий <code>Exception</code></li>\n<li>✅ Создавайте собственные исключения для специфичных ситуаций в вашем приложении</li>\n<li>❌ Не используйте пустой <code>except:</code> — это может скрыть критические ошибки</li>\n<li>❌ Не перехватывайте <code>KeyboardInterrupt</code> и <code>SystemExit</code> без необходимости</li>\n</ul>\n\n<p>В следующем уроке мы рассмотрим подробную таблицу всех встроенных исключений Python.</p>", "video": null, "options": {}, "subtitle_files": [], "is_deprecated": false, "source": {}, "subtitles": {}, "tests_archive": null, "feedback_correct": "", "feedback_wrong": "" }, "id": null, "has_review": false, "time": "2026-01-27T00:00:00.000Z" }