Обработка Python-ошибок сложных функций

Я хотел бы знать, существует ли способ обработки ошибок Python в долго выполняемых функциях, которые могут содержать ошибки, частично не влияющие на возможность продолжения функции.

В качестве примера, рассмотрим функцию, которая, учитывая список URL-адресов, рекурсивно извлекает ресурс и все связанные ресурсы по пути URL-адресов верхнего уровня. Он хранит полученные ресурсы в локальной файловой системе со структурой каталогов, отражающей структуру URL. По сути, это базовый рекурсивный wget для списка страниц.

Существует ряд моментов, в которых эта функция может дать сбой:

  • URL-адрес может быть недействительным или неразрешимым
  • Хост может быть недоступен ( возможно, временно)
  • Локальное сохранение может приводить к ошибкам диска
  • - все, что вы можете придумать.

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

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

Я имею в виду несколько альтернатив:

  • Ошибки записи в списке по мере их появления и прервать обработку этого ресурса любых дочерних ресурсов, но перейти к следующему ресурсу. Можно использовать порог, чтобы прервать всю функцию, если возникает слишком много ошибок, или просто попробовать все. Вызывающий может опросить этот список по завершении функции, чтобы узнать, есть ли какие-либо проблемы.
  • Вызывающий может предоставить вызываемый объект, который вызывается при каждой ошибке. Это перекладывает ответственность за запись ошибок обратно на вызывающего абонента. Вы даже можете указать, что если вызываемый объект возвращает False, обработка должна остановиться. Это переместит управление порогом к вызывающей стороне.
  • Реализуйте первое с последним, предоставив объект обработки ошибок, который кодирует поведение первого.

В обсуждениях Python я часто отмечал определенные подходы, описанные как Pythonic или non -Пифонический. Я хотел бы знать, есть ли какие-либо особые подходы Pythonic к обработке описанного выше типа сценария.

Есть ли в Python какие-либо батареи, которые моделируют более сложную обработку ошибок, чем модель обработки исключений с завершением, или в более сложных элементах питания используется модель обработки ошибок, которую я должен скопировать, чтобы оставаться Pythonic?

Примечание: пожалуйста, не сосредотачивайтесь на примере. Я не ищу решения проблем в этой конкретной области, но мне показалось, что это хороший пример, который большинство людей здесь должно понять.

6
задан camh 4 April 2011 в 23:49
поделиться