Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
# Конструкции Try-Except в Python
Полная поддержка обработки исключений — одна из ключевых особенностей Python. Рассмотрим все варианты.
1. Базовая конструкция try-except
try:
result = 10 / 0 # Выбросит ZeroDivisionError
except ZeroDivisionError:
print("Ошибка: деление на ноль")
Если в блоке try возникает исключение, выполнение прыгает в соответствующий except блок.
2. Множественные except блоки
try:
# Опасный код
data = json.loads(user_input)
value = int(data["age"])
result = 100 / value
except ValueError as e:
print(f"Ошибка парсинга: {e}")
except ZeroDivisionError as e:
print(f"Деление на ноль: {e}")
except json.JSONDecodeError as e:
print(f"Невалидный JSON: {e}")
Важно: Порядок имеет значение! Специфичные исключения должны быть первыми.
3. Ловля нескольких исключений одновременно
try:
data = fetch_user_data()
except (ValueError, KeyError, AttributeError) as e:
print(f"Ошибка обработки данных: {e}")
Используй кортеж для группировки нескольких типов исключений.
4. Блок else
try:
file = open("data.txt", "r")
except FileNotFoundError:
print("Файл не найден")
else:
content = file.read()
print(f"Прочитано {len(content)} байт")
file.close()
Блок else выполняется только если try завершился без ошибок. Полезно для кода, который зависит от успеха try.
5. Блок finally
try:
connection = connect_to_database()
execute_query(connection)
except ConnectionError:
print("Ошибка подключения")
finally:
if connection:
connection.close()
Finally выполняется всегда — обязательно закрыть ресурс. Это включает случаи когда: было исключение, выполнен return в try/except или возникло новое исключение.
6. Полная конструкция try-except-else-finally
try:
file = open("config.json", "r")
config = json.load(file)
except FileNotFoundError:
print("Конфигурация не найдена")
config = {}
except json.JSONDecodeError:
print("Невалидный JSON")
config = {}
else:
print(f"Загружено {len(config)} параметров")
finally:
try:
file.close()
except NameError:
pass
7. Получение информации об исключении
try:
items = [1, 2, 3]
item = items[10]
except IndexError as e:
print(f"Тип: {type(e).__name__}")
print(f"Сообщение: {str(e)}")
print(f"Args: {e.args}")
8. Re-raising исключений
try:
risky_operation()
except ValueError as e:
logger.error(f"Ошибка обработки данных: {e}")
raise # Пробросить дальше вверх по стеку
Исключение распространяется к вызывающей функции, но мы логировали его.
9. Конвертирование исключений
try:
result = int(user_input)
except ValueError as e:
raise ValueError(f"Ожидается число, получено: {user_input}") from e
Вариант "from e" сохраняет оригинальное исключение в цепи, помогая отладке.
10. Context managers (with statement)
with open("data.txt", "r") as file:
content = file.read()
# Файл автоматически закроется даже при исключении
Это более элегантный способ работы с ресурсами, чем try-finally.
11. Custom исключения
class InvalidUserAgeError(ValueError):
def __init__(self, age):
self.age = age
super().__init__(f"Возраст {age} невалидный")
try:
raise InvalidUserAgeError(999)
except InvalidUserAgeError as e:
print(f"Ошибка: {e}")
print(f"Возраст: {e.age}")
12. Assertы
def divide(a, b):
assert b != 0, "Делитель не может быть нулём"
return a / b
Assert выбрасывает AssertionError если условие False.
Best Practices
# Правильно — специфичный except с информацией
try:
file = open("data.json", "r")
data = json.load(file)
except FileNotFoundError:
logger.error("Конфигурационный файл не найден")
data = {}
except json.JSONDecodeError as e:
logger.error(f"Невалидный JSON")
data = {}
finally:
try:
file.close()
except NameError:
pass
Иерархия исключений
Самые распространённые:
- Exception (базовый класс)
- ValueError, TypeError, KeyError
- FileNotFoundError, OSError
- RuntimeError, NotImplementedError
- ZeroDivisionError, IndexError
- ImportError, AttributeError
Отладка
import traceback
try:
risky_code()
except Exception as e:
traceback.print_exc()
error_text = traceback.format_exc()
logger.error(error_text)
Обработка исключений в Python — это искусство нахождения баланса между надёжностью и гибкостью кода.