> For the complete documentation index, see [llms.txt](https://kaze.gitbook.io/qa-theory/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kaze.gitbook.io/qa-theory/osnovy-programmirovaniya-na-python/isklyucheniya.md).

# Исключения

### 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. **Базовая обработка исключений**

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

***

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

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

***

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

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

***

### 6. **Блок `else` и `finally`**

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

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

***

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

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

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

***

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

```python
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 ошибок**

```python
import requests

try:
    r = requests.get("https://httpbin.org/delay/5", timeout=2)
except requests.exceptions.Timeout:
    print("Таймаут запроса!")
```

* **Прерывание теста, если данные некорректны**

```python
import pytest

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