Свои команды · Шаг 3 из 4
Ошибка вместо падения
Своя команда — это своя ошибка: опечатка в дате, деление на ноль, несуществующий ключ. Утилита, которая на это отвечает двадцатью строками трассировки, выглядит сломанной, а сломана в ней одна команда из десяти.
Что сделать
Сделайте так, чтобы ошибка в одной команде была строкой текста, а не двадцатью строками трассировки.
Что приходит
imya— имя команды для сообщения
Что вернуть
Декоратор; обёртка отдаёт результат функции, а при ошибке-наследнике Exception — "команда «сумма» не сработала: текст ошибки"; имя и описание функции сохраняются.
Допишите функцию bezopasno в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
В проекте
Каждая команда в оболочке обёрнута @bezopasno("имя"). Решите шаг — и ошибка в одной команде будет одной строкой текста, а не двадцатью строками трассировки.
summa обёрнута @bezopasno("сумма") и бросает ValueError("нечего складывать"), если чисел нет. summa(2, 3) возвращает 5, а summa() — строку «команда «сумма» не сработала: нечего складывать».
Функция принимает имя команды и возвращает декоратор.
Обёртка вызывает исходную функцию и возвращает её результат.
Если исходная функция бросила исключение, обёртка гасит его и возвращает строку вида «команда «сумма» не сработала: текст ошибки» — имя в кавычках-ёлочках, после двоеточия текст исключения. Если текст исключения пуст, вместо него ставится название класса исключения: «команда «сумма» не сработала: ValueError». Гасятся только исключения-наследники Exception: прерывание с клавиатуры и выход из программы гасить нельзя. Имя и описание исходной функции сохраняются.
Образцовый тест целиком
@bezopasno("сумма")
def summa(*chisla):
if not chisla:
raise ValueError("нечего складывать")
return sum(chisla)
(summa(2, 3), summa())
(5, 'команда «сумма» не сработала: нечего складывать')
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.