Как создать исключение Python с несколькими причинами? - PullRequest
3 голосов
/ 07 марта 2019

Как вызвать исключение Python по нескольким причинам, аналогично Java addSuppressed () ?Например, у меня есть список нескольких методов, и если ни один из них не работает, я хочу вызвать исключение, которое включает исключения из всех методов, которые были опробованы.Т.е.:

exceptions = []
for method in methods_to_try:
  try:
    method()
  except Exception as e:
    exceptions.append(e)
if exceptions:
  raise Exception("All methods failed") from exceptions

Но этот код завершается ошибкой, поскольку оператор raise ... from ... ожидает единственное исключение, а не список.Python 2 или 3 решения являются приемлемыми.Все обратные трассировки и сообщения об исключениях должны быть сохранены.

Ответы [ 2 ]

2 голосов
/ 21 марта 2019

Просто передайте исключения в качестве аргументов при создании последнего исключения.

for method in methods_to_try:
    try:
        method()
    except Exception as e:
        exceptions.append(e)
if exceptions:
    raise Exception(*exceptions)

Они будут доступны в атрибуте args.

0 голосов
/ 21 марта 2019

Вместо этого используйте ведение журнала

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...