МУНИЦИПАЛЬНОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ДОПОЛНИТЕЛЬНОГО ОБРАЗОВАНИЯ
«ЦЕНТР ДЕТСКОГО ТЕХНИЧЕСКОГО ТВОРЧЕСТВА»
Методическая разработка
«Распространение исключений в Python»
к дополнительной общеобразовательной
общеразвивающей программе
технической направленности
«Программирование на Python»
Возраст детей: 10-17 лет
Автор: Костычев Вадим Александрович
г. Заречный Пензенской области
2025 г.
Данный материал предназначен для преподавателей информатики, программирования и студентов (учащихся), изучающих язык программирования Python. Он может быть использован как на лекциях, так и при проведении практических занятий или самостоятельной работе.
Цель: формирование у обучающихся понимания механизма распространения исключений в стеке вызовов функций, а также развитие навыков написания программ с правильной передачей ошибок между уровнями программы.
Задачи:
-
Объяснить, что такое распространение исключений.
-
Показать, как исключения передаются от одной функции к другой.
-
Научить правильно использовать try...except в разных уровнях вызова.
-
Развить навыки проектирования кода с учётом обработки ошибок.
-
Подготовить обучающихся к созданию сложных программ с несколькими уровнями вложенности.
Что такое распространение исключений?
В Python, если исключение возникает внутри функции и не обрабатывается внутри этой функции, оно передаётся выше по стеку вызовов, то есть вызывающей функции. Этот процесс называется распространением исключения (exception propagation).
Если ни одна из функций не перехватывает исключение — программа завершает выполнение и выводит traceback.
Пример 1: Простое распространение исключения
def divide(a, b):
return a / b
def calculate():
result = divide(10, 0)
print(result)
calculate()
Ошибка:
ZeroDivisionError: division by zero
Здесь исключение возникает в divide, но не обрабатывается, поэтому оно распространяется в calculate, а затем выходит за пределы программы.
Пример 2: Обработка исключения на верхнем уровне
def divide(a, b):
return a / b
def calculate():
result = divide(10, 0)
print(result)
try:
calculate()
except ZeroDivisionError:
print("Ошибка: деление на ноль")
Вывод:
Ошибка: деление на ноль
Теперь исключение, возникшее глубоко в стеке, было поймано на более высоком уровне.
Пример 3: Локальная обработка исключения
def divide(a, b):
try:
return a / b
except ZeroDivisionError:
print("Нельзя делить на ноль!")
def calculate():
result = divide(10, 0)
print("Результат:", result)
calculate()
Вывод:
Нельзя делить на ноль!
Результат: None
Здесь исключение поймано внутри функции divide , и дальнейшее выполнение программы продолжается.
Задание 1: Исследование стека вызовов
Имеется следующий код:
def func_a():
x = int(input("Введите число: "))
return 10 / x
def func_b():
result = func_a()
print("Результат:", result)
def main():
try:
func_b()
except ValueError:
print("Ошибка: введите число")
main()
Вопросы:
-
Какие исключения могут возникнуть в этом коде?
-
Где они обрабатываются?
-
Что произойдёт, если пользователь введёт 0?
-
Как изменить код, чтобы обработать ZeroDivisionError?
Задание 2: Обработка ошибок в модульной структуре
Представьте, что у вас есть несколько модулей:
-
math_utils.py
-
user_interface.py
-
main.py
math_utils.py
def divide(a, b):
return a / b
user_interface.py
from math_utils import divide
def get_input():
a = float(input("Число A: "))
b = float(input("Число B: "))
result = divide(a, b)
print("Результат:", result)
main.py
from user_interface import get_input
try:
get_input()
except Exception as e:
print("Произошла ошибка:", str(e))
Вопросы:
-
Где возникает исключение?
-
Кто его обрабатывает?
-
Можно ли обработать разные типы ошибок по-разному?
Упражнения для самостоятельного выполнения
-
Напишите программу с тремя уровнями вложенных функций, где ошибка возникает в самой нижней, но обрабатывается в самой верхней.
-
Создайте программу, которая читает данные из файла через цепочку функций. Используйте try...except только в главной функции.
-
Реализуйте систему ввода данных пользователя, обработки и вывода результата, используя механизм распространения исключений.
Контрольные вопросы
-
Что такое распространение исключений?
-
Почему важно понимать, как исключения передаются между функциями?
-
Может ли исключение быть обработано на любом уровне программы?
-
Чем отличается локальная обработка от централизованной?
-
Как влияет распространение исключений на структуру программы?