# Исключения

### 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)
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://kaze.gitbook.io/qa-theory/osnovy-programmirovaniya-na-python/isklyucheniya.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
