Конструкция try-except: перехват ошибок

Конструкция try-except: перехват ошибок Обработка исключений

Привет! В прошлой статье мы узнали, что такое исключения и зачем их обрабатывать. Теперь пришло время научиться их перехватывать с помощью конструкции try-except.

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

  • Синтаксис try-except
  • Перехват разных типов ошибок
  • Множественные блоки except
  • Получение текста ошибки

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

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

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

Совет: try-except — главный инструмент для обработки ошибок в Python.

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

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

try:
    # Код, который может вызвать ошибку
    number = int(input("Введите число: "))
    result = 10 / number
    print(f"Результат: {result}")
except ZeroDivisionError:
    # Код, который выполнится при ошибке ZeroDivisionError
    print("Ошибка: деление на ноль")
[/code]

Как это работает:

  1. Выполняется код внутри try
  2. Если возникает ошибка, программа переходит в блок except
  3. Код в except выполняется вместо упавшей части
  4. Программа продолжает работу

Перехват разных типов ошибок

try:
    value = int(input("Введите число: "))
    result = 10 / value
    print(f"Результат: {result}")
except ZeroDivisionError:
    print("Ошибка: деление на ноль")
except ValueError:
    print("Ошибка: нужно ввести число")

Множественные исключения в одном блоке

try:
    value = int(input("Введите число: "))
    result = 10 / value
    print(f"Результат: {result}")
except (ZeroDivisionError, ValueError):
    print("Ошибка: либо деление на ноль, либо не число")

Получение текста ошибки (as)

try:
    with open("file.txt", "r") as file:
        content = file.read()
except FileNotFoundError as error:
    print(f"Ошибка: {error}")
    print("Файл не найден")
except Exception as error:
    print(f"Неизвестная ошибка: {error}")

Перехват всех исключений (плохая практика)

try:
    value = int(input("Введите число: "))
    result = 10 / value
    print(f"Результат: {result}")
except Exception:
    print("Произошла ошибка")

Важно: Не рекомендуется перехватывать все исключения без конкретики — это скрывает реальные проблемы.

Блок else (выполняется при отсутствии ошибок)

try:
    value = int(input("Введите число: "))
    result = 10 / value
except ZeroDivisionError:
    print("Ошибка: деление на ноль")
except ValueError:
    print("Ошибка: нужно ввести число")
else:
    print("Деление выполнено успешно!")
    print(f"Результат: {result}")

Блок finally (выполняется всегда)

try:
    file = open("data.txt", "r")
    content = file.read()
except FileNotFoundError:
    print("Файл не найден")
finally:
    # Этот код выполнится всегда
    print("Завершение работы с файлом")
    if 'file' in locals():
        file.close()

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

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

def get_number(prompt):
    while True:
        try:
            value = int(input(prompt))
            return value
        except ValueError:
            print("Ошибка: введите число!")

age = get_number("Введите ваш возраст: ")
print(f"Ваш возраст: {age}")

Пример 2. Безопасное деление:

def safe_divide(a, b):
    try:
        return a / b
    except ZeroDivisionError:
        return "Ошибка: деление на ноль"
    except TypeError:
        return "Ошибка: неподдерживаемые типы"

print(safe_divide(10, 2))   # 5.0
print(safe_divide(10, 0))   # Ошибка: деление на ноль
print(safe_divide(10, "2")) # Ошибка: неподдерживаемые типы

Пример 3. Работа с файлом с обработкой всех ошибок:

def read_config(filename):
    try:
        with open(filename, "r") as file:
            return file.read()
    except FileNotFoundError:
        print(f"Файл {filename} не найден")
        return ""
    except PermissionError:
        print(f"Нет прав на чтение {filename}")
        return ""
    except Exception as e:
        print(f"Ошибка при чтении {filename}: {e}")
        return ""

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

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

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

Задача 3. Напиши программу, которая открывает файл и обрабатывает FileNotFoundError.

Задача 4. В чём разница между except ValueError: и except Exception:?

Задача 5. Когда выполняется блок else в try-except?

Ответы:

Задача 1.

try:
    num = int(input("Введите число: "))
    print(f"Вы ввели: {num}")
except ValueError:
    print("Ошибка: введите число")

Задача 2.

def safe_divide(a, b):
    try:
        return a / b
    except ZeroDivisionError:
        return "Ошибка: деление на ноль"
    except TypeError:
        return "Ошибка: неподходящие типы"

Задача 3.

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

Задача 4.

# except ValueError — перехватывает только ValueError
# except Exception — перехватывает все исключения

Задача 5.

# Блок else выполняется, если в блоке try не было ошибок

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

Порядок except важен

try:
    value = int(input())
except Exception:
    print("Общая ошибка")
except ValueError:   # Никогда не выполнится
    print("Ошибка Value")

Сначала конкретные исключения, потом общие.

Исключения в блоке except

Если в except возникает ошибка, она не будет обработана.

try:
    result = 10 / 0
except ZeroDivisionError:
    print(1 / 0)   # Ошибка! Не обрабатывается

finally выполняется всегда

try:
    result = 10 / 2
except ZeroDivisionError:
    print("Ошибка")
finally:
    print("Это всегда выполняется")
# Вывод: 5.0, "Это всегда выполняется"

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

Ошибка 1: Слишком широкий перехват

try:
    value = int(input())
except Exception:
    print("Ошибка")   # Непонятно, какая ошибка

Лучше: except ValueError:

Ошибка 2: Пустой except

try:
    value = int(input())
except:
    pass   # Подавляет все ошибки

Никогда не используй пустой except.

Ошибка 3: Неправильный порядок except

try:
    value = int(input())
except Exception:
    print("Ошибка")
except ValueError:   # Никогда не выполнится
    print("Не число")

Сначала специфичные исключения, потом общие.

Шпаргалка

Что нужноКак пишется
Перехватить конкретную ошибкуexcept ValueError:
Перехватить несколько ошибокexcept (ValueError, TypeError):
Перехватить любую ошибкуexcept Exception:
Получить текст ошибкиexcept Exception as e:
Блок при успехеelse:
Блок всегдаfinally:

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

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

  • Синтаксис try-except
  • Перехват разных типов ошибок
  • Множественные блоки except
  • Получение текста ошибки
  • Блоки else и finally

КВИЗ

Что дальше?

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