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

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

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

Пример кода:

Python
Скопировать код
try:
    # Здесь располагается потенциально опасный код
    pass
except (TypeError, ValueError) as e:
    # Одновременная обработка нескольких типов исключений
    print(f"Выявлены ошибки типов TypeError или ValueError: {e}")
except Exception as e:
    # Перехватываем все остальные исключения
    print(f"Обнаружено неожиданное исключение: {e}")

Если подводить итог:

  • Чтобы улучшить читаемость кода, разделяйте исключения по различным блокам except
  • Группируйте исключения с использованием кортежей, если они обрабатываются одинаково
  • Используйте Exception как универсальный перехватчик исключений, если необходимо обрабатывать неизвестные ошибки
  • Во избежание сложностей в отладке программы, лучше явно обрабатывать исключения
Кинга Идем в IT: пошаговый план для смены профессии

Понимание иерархии исключений

Чтобы эффективно настроить блоки try-except, следует начать с выполнения обработки конкретных исключений, таких как KeyboardInterrupt, и завершить на общем классе Exception, знание иерархии исключений Python очень важно.

Python
Скопировать код
try:
    # Коду, которому предоставляется последний шанс
except KeyboardInterrupt:
    # Отдельная обработка прерываний с клавиатуры
except IOError as e:
    # Здесь возникли проблемы с вводом-выводом
    handle_io_error(e)
except Exception as general_error:
    # В этом месте отлавливаются неожиданные исключения
    log_exception(general_error)

Следовательно, обработка специфических исключений производится перед общим типом исключения Exception.

Лучшие практики и сложная обработка исключений

Используйте иерархию исключений

Стремитесь понять наследование исключений, чтобы лучше перехватывать наиболее конкретные ошибки, а затем двигаться к более общим в иерархии. Это позволит в точности обрабатывать проблемы в программах и выводить более точные сообщения об ошибках для пользователей.

Добавьте else и finally

Блок else выполнится после блока try, если в нем не было исключений, а finally выполнится в любом случае. Это дает больше контроля над порядком исполнения кода.

Избегайте общих перехватчиков исключений

Постарайтесь использовать конкретные исключения вместо общего Exception. Это упростит отладку и повысит надежность программы.

Записывайте ошибки в журнал

Записывайте исключения в журнал немедленно после их возникновения. Информация о контексте, в котором произошла ошибка, особенно важна для эффективного разрешения проблем. Для этого вам может помочь стандартная библиотека logging.

Пример использования логирования ошибок:

Python
Скопировать код
import logging

try:
    # здесь может возникнуть потенциально опасная ситуация
except SpecificError as e:
    logging.error("Обнаружена проблема: мы оказались в блоке except", exc_info=True)
except AnotherError as e:
    logging.warning("Наш код выбрал альтернативный путь", exc_info=True)
except Exception as e:
    logging.exception("Возникла непредвиденная опасность")

Создайте специализированные пользовательские исключения

Пользовательские исключения помогают точно управлять исполнением кода и упрощают обработку определенных видов ситуаций.

Визуализация

Обработку исключений можно представить в виде управления трафиком:

Markdown
Скопировать код
try:
 | 🚦          |  except:
 | Светофор   |  | Обработчик |
 | – - – - – - |  | – - – - – |
 | 🟢 Зеленый  |  | ValueError -> Остановиться и отладить |
 | 🟠 Желтый   |  | TypeError -> Быть осторожными и проверить снова |
 | 🔴 Красный  |  | KeyError -> Исправить и повторить попытку |
 | 🚨 Авария   |  | Exception -> Немедленно вызвать помощь |

Каждый "цвет светофора" отражает группу исключений и соответствующие действия, которые следует предпринять при их возникновении.

Продвинутые методы и советы профессионалов

Обработка повторно возникших исключений

Если требуется, обработайте исключение и повторно вызовите его с помощью raise для передачи дальше по стеку вызовов.

Python
Скопировать код
try:
    # Проверяем, что может произойти здесь
except SomeError as e:
    handle_error(e)
    # Повторно вызываем ошибку
    raise

Связывание исключений в цепочку

Используйте from для явного указания на причинно-следственную связь между исключениями. Это гарантирует, что исходная ошибка не будет утеряна в цепочке исключений.

Python
Скопировать код
try:
    # Здесь может произойти исходное исключение
except FirstError as e:
    raise SecondError("Произошла вторая ошибка, это было неожиданно, не так ли?") from e

Полезные материалы

Официальная документация Python [...]

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы