← До списку лабораторних по Python
Повний опис / сценарій лабораторної:
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: опиши переваги власної ієрархії винятків у складному застосунку.