/
disciplina
/
stepik-python-debugging
Обзор
Документация
Войти
/
disciplina
/
stepik-python-debugging
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
lessons/module1/1.2/lesson3.step
18 строк
10 KB
Sergey
Вторая версия курса
27 янв 2026, 21:14
27 янв 2026, 21:14
79b9655
Код
Авторство
О чём код?
{ "block": { "name": "text", "text": "<h2>Визуализация иерархии классов исключений в Python</h2>\n\n<p>Понимание иерархии исключений помогает правильно их обрабатывать и создавать собственные типы исключений. Ниже представлена полная структура встроенных исключений Python.</p>\n\n<h3>Полная иерархия исключений</h3>\n\n<pre>\n<strong>BaseException</strong>\n ├── <strong>BaseExceptionGroup</strong>\n ├── <strong>GeneratorExit</strong>\n ├── <strong>KeyboardInterrupt</strong>\n ├── <strong>SystemExit</strong>\n └── <strong>Exception</strong>\n ├── <strong>ArithmeticError</strong>\n │ ├── FloatingPointError\n │ ├── OverflowError\n │ └── ZeroDivisionError\n │\n ├── <strong>AssertionError</strong>\n │\n ├── <strong>AttributeError</strong>\n │\n ├── <strong>BufferError</strong>\n │\n ├── <strong>EOFError</strong>\n │\n ├── <strong>ExceptionGroup</strong> [BaseExceptionGroup]\n │\n ├── <strong>ImportError</strong>\n │ └── ModuleNotFoundError\n │\n ├── <strong>LookupError</strong>\n │ ├── IndexError\n │ └── KeyError\n │\n ├── <strong>MemoryError</strong>\n │\n ├── <strong>NameError</strong>\n │ └── UnboundLocalError\n │\n ├── <strong>OSError</strong>\n │ ├── BlockingIOError\n │ ├── ChildProcessError\n │ ├── <strong>ConnectionError</strong>\n │ │ ├── BrokenPipeError\n │ │ ├── ConnectionAbortedError\n │ │ ├── ConnectionRefusedError\n │ │ └── ConnectionResetError\n │ ├── FileExistsError\n │ ├── FileNotFoundError\n │ ├── InterruptedError\n │ ├── IsADirectoryError\n │ ├── NotADirectoryError\n │ ├── PermissionError\n │ ├── ProcessLookupError\n │ └── TimeoutError\n │\n ├── <strong>ReferenceError</strong>\n │\n ├── <strong>RuntimeError</strong>\n │ ├── NotImplementedError\n │ ├── PythonFinalizationError\n │ └── RecursionError\n │\n ├── <strong>StopAsyncIteration</strong>\n │\n ├── <strong>StopIteration</strong>\n │\n ├── <strong>SyntaxError</strong>\n │ └── <strong>IndentationError</strong>\n │ └── TabError\n │\n ├── <strong>SystemError</strong>\n │\n ├── <strong>TypeError</strong>\n │\n ├── <strong>ValueError</strong>\n │ └── <strong>UnicodeError</strong>\n │ ├── UnicodeDecodeError\n │ ├── UnicodeEncodeError\n │ └── UnicodeTranslateError\n │\n └── <strong>Warning</strong>\n ├── BytesWarning\n ├── DeprecationWarning\n ├── EncodingWarning\n ├── FutureWarning\n ├── ImportWarning\n ├── PendingDeprecationWarning\n ├── ResourceWarning\n ├── RuntimeWarning\n ├── SyntaxWarning\n ├── UnicodeWarning\n └── UserWarning\n</pre>\n\n<h3>Ключевые наблюдения</h3>\n\n<h4>1. Два уровня базовых классов</h4>\n<ul>\n<li><code>BaseException</code> — корень всей иерархии</li>\n<li><code>Exception</code> — базовый класс для пользовательских исключений</li>\n</ul>\n\n<h4>2. Системные исключения (прямые потомки BaseException)</h4>\n<p>Эти исключения <strong>не следует перехватывать</strong> в обычных блоках <code>except Exception</code>:</p>\n<ul>\n<li><code>KeyboardInterrupt</code> — пользователь хочет прервать программу</li>\n<li><code>SystemExit</code> — программа завершается</li>\n<li><code>GeneratorExit</code> — генератор закрывается</li>\n</ul>\n\n<h4>3. Категории исключений</h4>\n\n<table border=\"1\" cellpadding=\"5\" cellspacing=\"0\">\n<tr>\n<th>Базовый класс</th>\n<th>Категория</th>\n<th>Потомки</th>\n</tr>\n<tr>\n<td><code>ArithmeticError</code></td>\n<td>Арифметические ошибки</td>\n<td>FloatingPointError, OverflowError, ZeroDivisionError</td>\n</tr>\n<tr>\n<td><code>LookupError</code></td>\n<td>Ошибки доступа к элементам</td>\n<td>IndexError, KeyError</td>\n</tr>\n<tr>\n<td><code>OSError</code></td>\n<td>Ошибки ОС и файловой системы</td>\n<td>10+ специализированных исключений</td>\n</tr>\n<tr>\n<td><code>ConnectionError</code></td>\n<td>Ошибки сетевых подключений</td>\n<td>BrokenPipeError, ConnectionAbortedError, ConnectionRefusedError, ConnectionResetError</td>\n</tr>\n<tr>\n<td><code>UnicodeError</code></td>\n<td>Ошибки кодировки Unicode</td>\n<td>UnicodeDecodeError, UnicodeEncodeError, UnicodeTranslateError</td>\n</tr>\n<tr>\n<td><code>Warning</code></td>\n<td>Предупреждения</td>\n<td>10+ типов предупреждений</td>\n</tr>\n</table>\n\n<h3>Практическое применение иерархии</h3>\n\n<h4>Пример 1: Обработка группы связанных исключений</h4>\n<pre><code>try:\n result = 10 / x\nexcept ArithmeticError:\n # Поймает ZeroDivisionError, OverflowError, FloatingPointError\n print(\"Арифметическая ошибка\")\n</code></pre>\n\n<h4>Пример 2: Обработка всех ошибок доступа</h4>\n<pre><code>try:\n value = data[key]\nexcept LookupError:\n # Поймает как IndexError, так и KeyError\n print(\"Элемент не найден\")\n</code></pre>\n\n<h4>Пример 3: Обработка файловых операций</h4>\n<pre><code>try:\n with open('file.txt', 'r') as f:\n content = f.read()\nexcept OSError:\n # Поймает FileNotFoundError, PermissionError, IsADirectoryError и др.\n print(\"Ошибка работы с файлом\")\n</code></pre>\n\n<h4>Пример 4: Правильная обработка исключений</h4>\n<pre><code># ❌ Плохо — перехватывает системные исключения\ntry:\n dangerous_operation()\nexcept BaseException:\n pass\n\n# ✅ Хорошо — перехватывает только несистемные исключения\ntry:\n dangerous_operation()\nexcept Exception:\n pass\n\n# ✅ Ещё лучше — перехватывает конкретные исключения\ntry:\n dangerous_operation()\nexcept (ValueError, TypeError) as e:\n print(f\"Ошибка: {e}\")\n</code></pre>\n\n<h3>Создание собственных исключений</h3>\n\n<p>При создании пользовательских исключений следуйте структуре иерархии:</p>\n\n<pre><code>class MyAppError(Exception):\n \"\"\"Базовое исключение для моего приложения\"\"\"\n pass\n\nclass ValidationError(MyAppError):\n \"\"\"Ошибка валидации данных\"\"\"\n pass\n\nclass DatabaseError(MyAppError):\n \"\"\"Ошибка работы с базой данных\"\"\"\n pass\n\nclass ConnectionError(DatabaseError):\n \"\"\"Ошибка подключения к БД\"\"\"\n pass\n</code></pre>\n\n<p>Такая структура позволяет гибко обрабатывать ошибки:</p>\n<pre><code>try:\n app.run()\nexcept ValidationError:\n # Обработка ошибок валидации\n pass\nexcept DatabaseError:\n # Обработка всех ошибок БД (включая ConnectionError)\n pass\nexcept MyAppError:\n # Обработка всех остальных ошибок приложения\n pass\n</code></pre>\n\n<h3>Важные правила</h3>\n\n<ol>\n<li><strong>Порядок обработчиков важен</strong> — более специфичные исключения должны идти первыми</li>\n<li><strong>Не ловите BaseException</strong> без крайней необходимости</li>\n<li><strong>Используйте категории</strong> — обрабатывайте ArithmeticError вместо отдельного перечисления всех арифметических ошибок</li>\n<li><strong>Создавайте иерархию</strong> для своих исключений — это упростит их обработку</li>\n</ol>\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" }