Исключения

1. Что такое исключения

  • Исключение (exception) — это событие, которое прерывает нормальное выполнение программы, если его не обработать.

  • Пример: ошибка деления на ноль, отсутствующий ключ в словаре, таймаут в запросе к API.


2. Основные типы встроенных исключений

Исключение
Когда возникает
Пример

AssertionError

Не прошла проверка assert

assert 2 + 2 == 5

ValueError

Неверное значение аргумента

int("abc")

TypeError

Операция с несовместимыми типами

5 + "str"

KeyError

Нет ключа в словаре

data["missing"]

IndexError

Индексация вне диапазона

[1,2][5]

FileNotFoundError

Нет файла

open("abc.txt")

TimeoutError / requests.exceptions.Timeout

Таймаут операции

HTTP-запрос долго не отвечает


3. Базовая обработка исключений

try:
    result = 10 / 0
except ZeroDivisionError as e:
    print(f"Ошибка: {e}")

4. Обработка нескольких типов

try:
    value = int(input("Введите число: "))
    print(10 / value)
except ValueError:
    print("Нужно ввести число!")
except ZeroDivisionError:
    print("Делить на ноль нельзя!")

5. Объединённая обработка

try:
    data = {"a": 1}
    print(data["b"])
except (KeyError, IndexError) as e:
    print(f"Ошибка доступа к данным: {e}")

6. Блок else и finally

try:
    num = int("10")
except ValueError:
    print("Ошибка преобразования")
else:
    print("Всё прошло успешно")
finally:
    print("Закрываю соединение/файл")

💡 finally выполняется всегда — даже при ошибке.


7. Генерация собственных исключений

def validate_age(age):
    if age < 18:
        raise ValueError("Возраст должен быть ≥ 18")
    return True

try:
    validate_age(15)
except ValueError as e:
    print(f"Валидация не пройдена: {e}")

8. Пользовательские исключения

class LoginError(Exception):
    pass

def login(user, password):
    if password != "secret":
        raise LoginError("Неверный пароль")

try:
    login("user", "wrong")
except LoginError as e:
    print(f"Ошибка входа: {e}")

9. В автоматизации тестирования

  • Обработка API ошибок

import requests

try:
    r = requests.get("https://httpbin.org/delay/5", timeout=2)
except requests.exceptions.Timeout:
    print("Таймаут запроса!")
  • Прерывание теста, если данные некорректны

import pytest

def test_age_validation():
    with pytest.raises(ValueError):
        validate_age(15)

Last updated

Was this helpful?