Конкретные исключения: ValueError, TypeError, KeyError и другие

Конкретные исключения: ValueError, TypeError, KeyError и другие Обработка исключений

Привет! В прошлых статьях мы научились перехватывать ошибки. Но чтобы правильно их обрабатывать, нужно знать, какие ошибки вообще могут возникнуть. В Python есть множество встроенных исключений, и каждое из них говорит о конкретной проблеме.

В этой статье мы разберём:

  • Основные типы исключений
  • Как они возникают
  • Как их правильно обрабатывать

Что нужно знать перед началом

Для этого урока тебе понадобится:

  • Установленный Python
  • Базовое понимание исключений (статьи 1–2 в этом подменю)

Совет: Знание типов исключений помогает быстрее находить и исправлять ошибки.

Основная часть

ValueError — неправильное значение

Возникает, когда функция получает аргумент правильного типа, но с недопустимым значением.

# Преобразование строки в число
try:
    number = int("abc")
except ValueError:
    print("Невозможно преобразовать в число")

# Поиск отсутствующего элемента (в списке)
try:
    fruits = ["яблоко", "банан"]
    fruits.index("вишня")
except ValueError:
    print("Элемент не найден")

TypeError — несовместимые типы

Возникает, когда операция применяется к объекту неподходящего типа.

# Сложение числа и строки
try:
    result = 5 + "10"
except TypeError:
    print("Нельзя складывать число и строку")

# Вызов несуществующего метода
try:
    x = 5
    x.append(10)
except TypeError:
    print("У int нет метода append")

KeyError — ключ отсутствует

Возникает при обращении к несуществующему ключу словаря.

user = {"name": "Анна", "age": 25}
try:
    city = user["city"]
except KeyError:
    print("Ключ 'city' отсутствует в словаре")

Как избежать:

city = user.get("city")   # Вернёт None
city = user.get("city", "Не указан")   # Вернёт "Не указан"

IndexError — выход за границы

Возникает при обращении к несуществующему индексу списка.

fruits = ["яблоко", "банан"]
try:
    item = fruits[5]
except IndexError:
    print("Индекс выходит за границы списка")

Как избежать:

if len(fruits) > 5:
    print(fruits[5])
else:
    print("Индекс вне диапазона")

NameError — неопределённая переменная

Возникает при использовании переменной, которая не была определена.

try:
    print(age)   # age не определена
except NameError:
    print("Переменная 'age' не определена")

AttributeError — нет атрибута или метода

Возникает при обращении к несуществующему атрибуту или методу.

number = 5
try:
    number.upper()   # У int нет метода upper()
except AttributeError:
    print("У int нет метода upper")

ZeroDivisionError — деление на ноль

Возникает при делении на ноль.

try:
    result = 10 / 0
except ZeroDivisionError:
    print("Ошибка: деление на ноль")

FileNotFoundError — файл не найден

Возникает при открытии несуществующего файла.

try:
    with open("nonexistent.txt", "r") as file:
        content = file.read()
except FileNotFoundError:
    print("Файл не найден")

Иерархия исключений

BaseException
├── SystemExit
├── KeyboardInterrupt
├── Exception
│   ├── ValueError
│   ├── TypeError
│   ├── KeyError
│   ├── IndexError
│   ├── NameError
│   ├── AttributeError
│   ├── ZeroDivisionError
│   ├── FileNotFoundError
│   └── ... (многие другие)
└── ...

Важно: Все исключения — наследники Exception. Это позволяет перехватывать все ошибки через except Exception:.

Примеры из реальной жизни

Пример 1. Обработка ввода пользователя:

def get_user_info():
    user = {}
    try:
        user["name"] = input("Имя: ")
        user["age"] = int(input("Возраст: "))
        return user
    except ValueError:
        print("Ошибка: возраст должен быть числом")
        return None

user = get_user_info()
print(user)

Пример 2. Работа со словарём:

def get_user_city(user):
    try:
        return user["city"]
    except KeyError:
        return "Не указан"

Задачи для закрепления

Задача 1. Напиши программу, которая преобразует строку в число и обрабатывает ValueError.

Задача 2. Напиши программу, которая обращается к словарю по ключу и обрабатывает KeyError.

Задача 3. Напиши программу, которая обращается к элементу списка по индексу и обрабатывает IndexError.

Задача 4. Какое исключение возникает при делении на ноль?

Задача 5. Какое исключение возникает при сложении числа и строки?

Ответы:

Задача 1.

def to_int(value):
    try:
        return int(value)
    except ValueError:
        return None

Задача 2.

def get_value(d, key):
    try:
        return d[key]
    except KeyError:
        return None

Задача 3.

def get_item(lst, index):
    try:
        return lst[index]
    except IndexError:
        return None

Задача 4.

ZeroDivisionError

Задача 5.

TypeError

Нюансы и подводные камни

Обработка ошибок в правильном порядке

try:
    value = int(input())
    result = 10 / value
except ValueError:
    print("Ошибка Value")
except ZeroDivisionError:
    print("Ошибка Zero")
# ValueError и ZeroDivisionError не перехватываются Exception

Перехват всех исключений через Exception

try:
    value = int(input())
except Exception as e:
    print(f"Произошла ошибка: {e}")

Ошибки в блоке except

try:
    value = int(input())
except ValueError:
    result = 10 / 0   # Ошибка не обрабатывается

Частые ошибки и как их избежать

Ошибка 1: Путаница между KeyError и IndexError

  • KeyError — для словарей
  • IndexError — для списков

Ошибка 2: Обработка ошибок без понимания

Всегда знай, что именно ты обрабатываешь.

Ошибка 3: Игнорирование ошибок

Всегда выводи сообщение или логируй ошибку.

Шпаргалка

ИсключениеКогда возникает
ValueErrorНеправильное значение
TypeErrorНеправильный тип
KeyErrorОтсутствует ключ в словаре
IndexErrorВыход за границы списка
NameErrorПеременная не определена
AttributeErrorНет атрибута/метода
ZeroDivisionErrorДеление на ноль
FileNotFoundErrorФайл не найден

Заключение / Выводы

Сегодня мы узнали:

  • Основные типы исключений
  • Как и когда они возникают
  • Как их правильно обрабатывать
  • Иерархию исключений

КВИЗ

Что дальше?

Оцените статью
IMI-DS - PYTHON LERNEN
Содержание
Оглавление ×