← Назад к вопросам

Какой синтаксис у исключений в Python?

2.2 Middle🔥 121 комментариев
#REST API и HTTP

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Синтаксис исключений в Python

Исключения (exceptions) в Python используются для обработки ошибок и исключительных ситуаций. Вот полное описание синтаксиса.

1. Базовый синтаксис try-except

try:
    # Код, который может вызвать ошибку
    result = 10 / 0
except ZeroDivisionError:
    # Обработка конкретного исключения
    print('Ошибка: деление на ноль')

2. Множественные исключения

try:
    value = int('abc')
    result = 10 / 0
except ValueError:
    print('Ошибка при преобразовании типа')
except ZeroDivisionError:
    print('Деление на ноль')
except Exception as e:
    print(f'Неизвестная ошибка: {e}')

3. Обработка нескольких исключений в одном блоке

try:
    value = int('abc')
except (ValueError, TypeError) as error:
    print(f'Ошибка: {error}')

4. Блок else

Выполняется, если исключения не возникли:

try:
    result = 10 / 2
except ZeroDivisionError:
    print('Ошибка')
else:
    print(f'Результат: {result}')  # Выведет: Результат: 5.0

5. Блок finally

Выполняется всегда, независимо от того, было ли исключение:

try:
    file = open('data.txt')
    data = file.read()
except FileNotFoundError:
    print('Файл не найден')
finally:
    file.close()  # Закроется в любом случае

Лучший способ — контекстный менеджер:

try:
    with open('data.txt') as file:
        data = file.read()
except FileNotFoundError:
    print('Файл не найден')

6. Возбуждение исключений (raise)

def validate_age(age):
    if age < 0:
        raise ValueError('Возраст не может быть отрицательным')
    return age

try:
    validate_age(-5)
except ValueError as e:
    print(f'Ошибка: {e}')

7. Переиспользование исключения

try:
    result = 10 / 0
except ZeroDivisionError as e:
    print('Ошибка обработана')
    raise  # Пробросить исключение дальше

8. Цепочка исключений (Exception Chaining)

try:
    result = 10 / 0
except ZeroDivisionError as e:
    raise RuntimeError('Критическая ошибка') from e

9. Иерархия встроенных исключений

# Главный класс
BaseException
    ├── SystemExit
    ├── KeyboardInterrupt
    └── Exception  # Все остальные исключения наследуют от этого
        ├── ValueError
        ├── TypeError
        ├── KeyError
        ├── IndexError
        ├── ZeroDivisionError
        └── ... и другие

10. Создание собственных исключений

class CustomError(Exception):
    '''Собственное исключение'''
    pass

class ValidationError(Exception):
    def __init__(self, field, message):
        self.field = field
        self.message = message
        super().__init__(f'{field}: {message}')

try:
    raise ValidationError('email', 'Некорректный формат')
except ValidationError as e:
    print(f'Ошибка в {e.field}: {e.message}')

11. Context Manager для управления ресурсами

from contextlib import contextmanager

@contextmanager
def manage_resource():
    print('Инициализация')
    try:
        yield 'ресурс'
    finally:
        print('Очистка')

with manage_resource() as res:
    print(f'Используем: {res}')

12. Полный пример с обработкой

def divide(a, b):
    try:
        if not isinstance(a, (int, float)):
            raise TypeError('a должно быть числом')
        if not isinstance(b, (int, float)):
            raise TypeError('b должно быть числом')
        if b == 0:
            raise ZeroDivisionError('Делитель не может быть 0')
        return a / b
    except (TypeError, ZeroDivisionError) as e:
        print(f'Ошибка: {e}')
        return None
    finally:
        print('Операция завершена')

print(divide(10, 2))   # Результат: 5.0
print(divide(10, 'a')) # Ошибка: b должно быть числом

Лучшие практики

  1. Лови конкретные исключения, не всё подряд
  2. Не игнорируй исключения молча
  3. Используй finally для очистки ресурсов
  4. Создавай свои исключения для специфических ошибок
  5. Логируй ошибки перед обработкой

Итог: Исключения в Python — это мощный механизм для контролируемой обработки ошибок. Синтаксис try-except-else-finally позволяет писать надёжный и предсказуемый код.