Добавил:
omninoy
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:ЛР-5 / lab5
.pyclass PhoneNumberError(Exception): #исключение, сигнализирующее о некорректном номере телефона
pass
class PhoneInputValidator:
def __init__(self):
self.max_attempts = 3
self.attempt = 1
#"состояние" для коррекции – можно менять подсказки или сбрасывать данные
self.help_level = 0 # чем выше, тем подробнее подсказка
def prepare_input(self): #подготовительные работы запрос ввода
print("\nввод номера телефона")
if self.help_level == 0:
prompt = "введите номер телефона (11 цифр): "
elif self.help_level == 1:
prompt = "пожалуйста, введите ровно 11 цифр без пробелов и скобок: "
else:
prompt = "важно! только цифры, 11 штук, пример 79123456789: "
return input(prompt)
def validate(self, phone: str) -> bool: #проверка корректности номера (контракт) возвращает True, если номер валиден
if not phone.isdigit():
return False
if len(phone) != 11:
return False
return True
def finish_success(self, phone: str): #завершающие работы при успешной проверке
print(f"номер {phone} успешно принят. Спасибо!")
def correct_state(self): #коррекция состояния (увеличиваем уровень помощи, сбрасываем попытки неявно)
self.help_level += 1
print(f"коррекция: включён уровень подсказок {self.help_level}")
def input_phone_with_retry(self):
#схема Мейера: повторяем попытки, пока Success != True
#при ошибке корректируем состояние и повторяем
success = False
while not success:
try:
#подготовительные работы
phone = self.prepare_input()
#проверка контракта (валидация)
if not self.validate(phone):
raise PhoneNumberError("некорректный номер")
#если всё хорошо - завершаем работу
self.finish_success(phone)
success = True #выход из цикла
except PhoneNumberError:
if self.attempt >= self.max_attempts:
#исчерпаны все попытки – выбрасываем исключение выше
raise PhoneNumberError(f"после {self.max_attempts} попыток номер не был принят.")
#коррекция состояния
self.correct_state()
self.attempt += 1
# success остаётся False, цикл продолжится
def run(self): #запуск с внешней обработкой финального исключения
try:
self.input_phone_with_retry()
except PhoneNumberError as e:
print(f"\nОШИБКА: {e}")
print("программа завершена из-за невозможности выполнить контракт.")
validator = PhoneInputValidator()
validator.run() 