← До фільтрів та технологій

← До списку лабораторних по Python

Python Лабораторна 16: Дизайн ієрархії винятків

Технологія: Python

Номер лабораторної: 16 · Рівень: middle

Тема: Обробка помилок і власні винятки

Повний опис / сценарій лабораторної:

Meta: навчитися створювати власні винятки і правильно обробляти помилки на межі сервісу.



Krok 1. Створити файл src/app/errors16.py.

Komandi: cd ~/python_lab1/src; touch app/errors16.py



Krok 2. Описати базовий виняток застосунку.

Komанда: printf "class AppError(Exception):
    pass

class ValidationError(AppError):
    pass

class ExternalServiceError(AppError):
    pass

" > app/errors16.py



Krok 3. Створити модуль з функцією яка може кидати ці винятки.

Komanda: printf "from .errors16 import ValidationError, ExternalServiceError

def process_user(name: str, age: int) -> str:
    if not name:
        raise ValidationError("name is empty")
    if age < 0:
        raise ValidationError("age is negative")
    if age > 120:
        raise ExternalServiceError("age seems unrealistic for external check")
    return f"user {name} ok"
" > app/logic16.py



Krok 4. Створити функцію entry point яка централізовано обробляє помилки.

Komanda: printf "from app.logic16 import process_user
from app.errors16 import ValidationError, ExternalServiceError

def main():
    try:
        print(process_user("Taras", 30))
        print(process_user("", 30))
    except ValidationError as e:
        print(f"validation error: {e}")
    except ExternalServiceError as e:
        print(f"external service error: {e}")

if __name__ == "__main__":
    main()
" > app/main16.py



Krok 5. Запустити main16 і подивитися вивід.

Komanda: export PYTHONPATH=$(pwd); python app/main16.py



Krok 6. Додати блок загального AppError для логування неочікуваних помилок.

Poyasnennya: це дозволить відрізняти прогнозовані помилки від загальних.



Krok 7. Занотувати принцип що глибокі шари коду кидають винятки, а поверхневі шари вирішують як реагувати.



Krok 8. Продумати мапінг винятків на HTTP коди для REST сервісу.



Krok 9. Додати декоратор який перехоплює AppError і перетворює на стандартну відповідь.



Krok 10. Mini zvit.

Zavdannya: опиши переваги власної ієрархії винятків у складному застосунку.