Привет! В прошлой статье мы узнали, что такое исключения и зачем их обрабатывать. Теперь пришло время научиться их перехватывать с помощью конструкции try-except.
В этой статье мы разберём:
- Синтаксис
try-except - Перехват разных типов ошибок
- Множественные блоки
except - Получение текста ошибки
- Что нужно знать перед началом
- Основная часть
- Базовый синтаксис try-except
- Перехват разных типов ошибок
- Множественные исключения в одном блоке
- Получение текста ошибки (as)
- Перехват всех исключений (плохая практика)
- Блок else (выполняется при отсутствии ошибок)
- Блок finally (выполняется всегда)
- Примеры из реальной жизни
- Задачи для закрепления
- Нюансы и подводные камни
- Порядок except важен
- Исключения в блоке except
- finally выполняется всегда
- Частые ошибки и как их избежать
- Ошибка 1: Слишком широкий перехват
- Ошибка 2: Пустой except
- Ошибка 3: Неправильный порядок except
- Шпаргалка
- Заключение / Выводы
- КВИЗ
- Что дальше?
Что нужно знать перед началом
Для этого урока тебе понадобится:
- Установленный Python
- Базовое понимание исключений (статья 1 в этом подменю)
Совет:
try-except— главный инструмент для обработки ошибок в Python.
Основная часть
Базовый синтаксис try-except
try:
# Код, который может вызвать ошибку
number = int(input("Введите число: "))
result = 10 / number
print(f"Результат: {result}")
except ZeroDivisionError:
# Код, который выполнится при ошибке ZeroDivisionError
print("Ошибка: деление на ноль")
[/code]Как это работает:
- Выполняется код внутри
try - Если возникает ошибка, программа переходит в блок
except - Код в
exceptвыполняется вместо упавшей части - Программа продолжает работу
Перехват разных типов ошибок
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






