316.51K
Category: programmingprogramming

Лекция 12+

1.

Лекция 12. Обработка
исключений в Python

2.

Цель занятия
Научиться работать с понятиями
«ошибка» и «исключение», познакомиться с
наиболее популярными исключения, изучить
операторы try-except-else-finally, научиться
писать программы с применением данных
операторов.

3.

Вопросы для повторения материала:
1. Что произойдет, если мы попытаемся целое число разделить на 0?
2. Какую ошибку увидим на экране, если попытаемся обратиться к
элементу списка по индексу, которого не существует?
3. Функция int() может преобразовать любой объект в целое число?
4. Можно ли использовать условный оператора if без оператора else?
5. Можно ли использовать условный оператор elif без оператора if?
В языке Python при написании программ мы постоянно
сталкиваемся с различного рода ошибками. Это не значит, что мы
плохие программисты, ни в коем случае. Каждый программист
ошибается, в этом нет ничего страшного. Но мы можем по-разному
относится к ошибкам в зависимости от того, какая именно ошибка
обнаружилась в нашем программном коде.

4.

Типы ошибок
Программирование – довольно сложный процесс, и вполне
естественно,
когда программист допускает ошибку. Так повелось, что
программные ошибки называют багами (от англ. bug – жучок). В
русскоязычной литературе это слово вы не встретите, но в сленге
программистов оно используется достаточно часто наряду со словом глюк.
Процесс поиска и устранения ошибок в англоязычной литературе
принято обозначать термином debugging, мы же будем называть его
отладкой.
Существует три типа ошибок, которые могут возникнуть в
программах:
синтаксические ошибки (syntax errors),
ошибки выполнения (runtime errors),
семантические ошибки (semantic errors).
Чтобы находить и исправлять их быстрее, имеет смысл научиться их
различать.

5.

Синтаксические ошибки (syntax errors)
Синтаксические ошибки возникают, если код нарушает правила
грамматики языка Python. Такие ошибки появляются ещё до выполнения
программы — на этапе компиляции.
Признаки:
Программа даже не запускается.
Сообщение об ошибке указывает на строку с проблемой.
Пример
пример

6.

Синтаксические ошибки (syntax errors)
Как избежать синтаксических ошибок?
• Использовать инструменты проверки синтаксиса
(например, встроенные линтеры в IDE).
• Проверять отступы и пары скобок при написании кода.
• Читать сообщения интерпретатора Python, они чётко
указывают на строку с проблемой.

7.

Ошибки выполнения (Runtime Errors)
Второй тип ошибок обычно возникает во время выполнения программы (их
принято называть исключительными ситуациями или, коротко – исключениями,
по-английски exceptions). Такие ошибки имеют другую причину. Если в программе
возникает исключение, то это означает, что по ходу выполнения произошло что-то
непредвиденное: например, программе было передано некорректное значение, или
программа попыталась разделить какое-то значение на ноль, что недопустимо с точки
зрения дискретной математики. Если операционная система присылает запрос на
немедленное завершение программы, то также возникает исключение.
Признаки:
Код синтаксически корректен и запускается.
Программа прерывается в процессе выполнения.
Примеры:
•Деление на ноль (ZeroDivisionError): result = 10 / 0 # Ошибка: деление на ноль.
•Обращение к несуществующему элементу (IndexError): my_list = [1, 2, 3]
print(my_list[5]) # Ошибка: индекс 5 вне
диапазона.
•Использование неопределённой переменной (NameError): print(value) # Ошибка:
переменная value не определена.
•Ошибка преобразования типов (TypeError): num = "5" + 5 # Ошибка: нельзя сложить
строку и число.

8.

Семантические ошибки (semantic errors)
Семантические ошибки — это ошибки логики, из-за которых
программа работает не так, как ожидается. Код написан правильно с точки
зрения синтаксиса и не вызывает ошибок выполнения, но результат не
соответствует замыслу программиста.
Признаки:
Программа запускается и завершается без ошибок.
Результат работы программы некорректен или не соответствует
ожиданиям.
Примеры:
Неправильный расчёт:
Решение семантических ошибок:
• Проведение тщательного тестирования программы.
• Использование инструментов для отладки и пошагового анализа.
• Чтение кода и логических блоков на предмет соответствия задаче.

9.

Семантические ошибки (semantic errors)
Как избежать семантических ошибок?
Чётко понимать задачу и требования перед написанием
кода.
Тестировать каждую функцию и проверять результаты.
Использовать модульные тесты (unittest, pytest) для
автоматической проверки логики.
Анализировать промежуточные результаты работы
программы.

10.

Исключения
Исключение — это событие, которое возникает во время
выполнения программы и нарушает ее нормальное выполнение.
В Python исключения используются для сигнализации об
ошибках, таких как:
• Деление на ноль (ZeroDivisionError),
• Доступ к несуществующему индексу (IndexError),
• Неверный тип данных (TypeError).
Почему важна обработка исключений?
Повышение надежности программ.
Предотвращение непредвиденного завершения работы.
Улучшение пользовательского опыта.

11.

Иерархия исключений в Python
• Все исключения наследуются от
базового класса BaseException.
• Часто используемый подкласс —
Exception.
• Пользовательские исключения
также наследуются от Exception.
Основные типы встроенных исключений

12.

Конструкции для обработки исключений в
Python
Python предлагает несколько основных конструкций для работы с
исключениями. Каждая из них решает конкретную задачу:
1. try-except:
Основная конструкция для перехвата и обработки исключений.
2. try-except-else:
Добавляет блок else, который выполняется, если исключение не произошло.
3. try-finally:
Гарантирует выполнение блока finally независимо от того, произошло
исключение или нет (например, для освобождения ресурсов).
4. try-except-else-finally:
Полная версия конструкции, объединяющая все предыдущие элементы.
5. raise:
Используется для возбуждения исключения вручную.
6. Вложенные блоки try:
Позволяют обрабатывать разные уровни исключений.
7. Обработка нескольких исключений:
Один блок except может обрабатывать сразу несколько типов исключений.

13.

1. Конструкция try-except
Определение: Основная конструкция для перехвата и обработки
исключений. Она позволяет программе продолжить выполнение, даже
если в блоке try возникла ошибка.
Место применения:
Когда нужно обработать предсказуемые ошибки, такие как неверный
ввод пользователя, отсутствие файла или некорректные данные.
Пример: обработка деления на ноль или доступа к несуществующему
ключу в словаре.
Преимущества:
Простота использования.
Позволяет перехватить конкретный тип ошибки.
Недостатки:
Если использовать общий except без указания типа исключения,
можно случайно скрыть критические ошибки.
При избыточном применении конструкция делает код сложным для
чтения.

14.

2. Конструкция try-except-else
Определение: Расширение базовой конструкции try-except,
добавляющее блок else, который выполняется, если исключение
не произошло.
Место применения:
Когда требуется выполнять дополнительные действия только в
случае успешного выполнения блока try.
Пример: обработка данных из файла, если он был успешно
открыт.
Преимущества:
Делает код более читаемым и
логически разделенным.
Недостатки:
Меньше гибкости в сравнение
с конструкцией finally.

15.

3. Конструкция try-finally
Определение: Используется для выполнения кода, который
должен сработать независимо от наличия исключений. Обычно
применяется для освобождения ресурсов.
Место применения:
Для закрытия файлов, завершения подключения к базе данных,
освобождения ресурсов (например, памяти).
Пример: автоматическое закрытие файла после его чтения.
Преимущества:
Гарантирует выполнение кода в
блоке finally.
Недостатки:
Нет возможности обработать ошибку
внутри этой конструкции (необходима комбинация с except).

16.

4. Конструкция try-except-else-finally
Определение: Полная версия конструкции, которая объединяет
try, except, else и finally.
Место применения:
Когда требуется выполнить все три этапа: обработка ошибки,
действия при успешном выполнении, финальные операции.
Пример: чтение данных из файла и закрытие файла независимо
от результата.
Преимущества:
Универсальность.
Разделение логики обработки и
завершения работы.
Недостатки:
Массивный блок кода,
если используются все части.

17.

5. Конструкция raise
Определение:
Используется для возбуждения исключения вручную, когда
нужно сигнализировать об ошибке в работе программы.
Место применения:
Для проверки данных и генерации пользовательских
исключений.
Пример: проверка корректности входных данных.
Преимущества:
Позволяет добавлять
собственные сообщения
об ошибках.
Недостатки:
Требует
дополнительной
обработки,
если
вызванное
исключение не обрабатывается.

18.

6. Вложенные блоки try
Определение:
Конструкция, позволяющая перехватывать исключения на
разных уровнях выполнения кода.
Место применения:
Для обработки ошибок в сложных программах с несколькими
уровнями логики.
Преимущества:
Гибкость в обработке ошибок.
Недостатки:
Может усложнить код.

19.

Пользовательские исключения в Python
Определение:
Пользовательские исключения — это классы, которые разработчики
создают самостоятельно для обработки специфических ситуаций, не
охватываемых стандартными исключениями Python.
Зачем они нужны?
• Позволяют повысить читаемость и структурированность кода.
• Позволяют лучше сигнализировать об ошибках в специфических
сценариях (например, ограничение ввода данных, бизнес-логика).
• Упрощают отладку сложных приложений.

20.

Пользовательские исключения в
Python
Преимущества пользовательских исключений
• Читаемость кода: сразу понятно, какая ошибка произошла.
• Логическое разделение: можно четко классифицировать типы
ошибок.
• Расширяемость: легко добавлять новые типы исключений в
больших проектах.
Недостатки пользовательских исключений
• Избыточность: излишнее создание исключений для простых
случаев может усложнить код.
• Потребность в обработке: каждое новое исключение требует
настройки логики обработки.
• Потенциальный рост количества классов: может стать трудно
управлять при большом количестве исключений.

21.

Пользовательские исключения в
Python
1. Создание пользовательского исключения начинается с
объявления класса, который наследуется от встроенного
Exception.
Вывод программы

22.

Логгирование в Python
Логгирование – это механизм регистрации событий,
происходящих в программе, включая сообщения об ошибках,
предупреждения,
отладочную
информацию
и
общую
информацию о выполнении. Python предоставляет встроенный
модуль logging, который позволяет гибко управлять логами.
Зачем нужно логгирование?
• Отладка: Позволяет выявлять и устранять ошибки.
• Анализ: Помогает анализировать выполнение программы
после ее завершения.
• Мониторинг: Удобно для отслеживания работы приложения в
реальном времени.
• Сохранение данных об ошибках: Все исключения и события
могут быть зафиксированы в журнале для последующего
анализа.

23.

Логгирование в Python
Основные уровни логирования.
Модуль logging предоставляет пять стандартных уровней логов:

24.

Логгирование с исключениями
Логгирование отлично работает в сочетании с
обработкой исключений import logging:

25.

Пример с условием проверки
num_1 = int(input())
num_2 = int(input())
if num_2 == 0:
print('Делить на ноль нельзя!')
else:
print(num_1 / num_2)
>>> ZeroDivisionError
Пример с try-except

26.

Конструкция try-except-else-finally
try – блок кода, где могут возникнуть ошибки
except – блок кода, который выполняется при
возникновении ошибки. Без указания конкретной
ошибки способен отлавливать все возникающие
ошибки и исключения.
else – блок кода, который выполняется при
отсутствии ошибок
finally – блок кода, который выполняется в любом
случае

27.

Конструкция try-except-else-finally
try: # код с вычислением остатка от деления
num_1 = int(input('Введите первое число:'))
num_2 = int(input('Введите второе число:'))
result = num_1 % num_2
except ZeroDivisionError: # обработка ошибки деления
на ноль
# повторно вводим второе число
num_2 = int(input('Делить на ноль нельзя,
введите новое число:'))
result = num_1 % num_2 # повторно вычисляем
остаток от деления
print(f'Остаток от деления: {result}')
except ValueError: # обработка некорректного ввода
print('Введены некорректные значения!')
# повторно вводим оба числа
num_1 = int(input('Введите первое число:'))
num_2 = int(input('Введите второе число:'))
result = num_1 % num_2
# повторно вычисляем
остаток от деления
print(f'Остаток от деления: {result}')
else: # если ошибки отсутствуют - выводим остаток от
деления
print(f'Остаток от деления:
{result}')
try:
# код с вычислением остатка от
деления
num_1
=
int(input('Введите
первое число:'))
num_2
=
int(input('Введите
второе число:'))
result = num_1 % num_2
except
ZeroDivisionError:
#
обработка ошибки деления на ноль
num_2 = int(input('Делить на
ноль
нельзя,
введите
новое
число:'))
except
ValueError:
#
обработка
некорректного ввода
print('Введено
некорректны
значения!')
num_1
=
int(input('Введите
первое число:'))
num_2
=
int(input('Введите
второе число:'))
finally:
result = num_1 % num_2
print(f'Остаток от деления:
{result}')

28.

Пример функции ввода числа с проверками

29.

Задачи
• 1. Напишите программу, которая читает
файл и обрабатывает ошибки, если файл не
найден или содержит некорректные
данные.
• 2. Создайте класс пользовательского
исключения для проверки возрастных
ограничений.

30.

Вопросы для повторения материала:
1. Что произойдет, если мы попытаемся целое число разделить на 0?
Увидим ошибку о делении на ноль – ZeroDivisionError
2. Какую ошибку увидим на экране, если попытаемся обратиться к элементу
списка по индексу, которого не существует?
Увидим ошибку IndexError
3. Функция int() может преобразовать любой объект в целое число?
Нет, только число или строку, состоящую из цифр
4. Можно ли использовать условный оператора if без оператора else?
Да, можно
5. Можно ли использовать условный оператор elif без оператора if?
Нет, нельзя
В языке Python при написании программ мы постоянно сталкиваемся с
различного рода ошибками. Это не значит, что мы плохие программисты, ни в
коем случае. Каждый программист ошибается, в этом нет ничего страшного. Но
мы можем по-разному относится к ошибкам в зависимости от того, какая именно
ошибка обнаружилась в нашем программном коде.
English     Русский Rules