Идиоматический способ сбора и сообщения о нескольких исключениях в Python - PullRequest
29 голосов
/ 26 марта 2012

Что люди использовали для одновременной регистрации, регистрации и сообщения о множественных ошибках проверки данных в Python?

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

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

errors = []
for item in data:
    try:
        process(item)
    except ValidationError as e:
        errors.append(e)
if errors:
    raise MultipleValidationErrors(errors)

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

Другие рекомендуют использовать модуль traceback, но, поскольку я хочу уловить исключения, это ошибки проверки данных, а не ошибки программы, что кажется неуместным. Впрочем, получение соответствующего модуля logging может быть уместным.

1 Ответ

7 голосов
/ 26 марта 2012

Я использовал эту идиому в C ++ и Python.Это самое чистое решение, которое я знаю, когда то, что вы хотите, является исключением, а не лог-сообщением.Недостатком является то, что комбинированное исключение занимает в общем случае линейное пространство, что может быть проблематично при обработке больших наборов данных со многими ошибками.

...