Подтвердить что ты не робот

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

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

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

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

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.

4b9b3361

Ответ 1

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