Исключения Python - перехват всех исключений, кроме ожидаемого - PullRequest
0 голосов
/ 03 декабря 2018

Я работаю над простым скриптом автоматизации на Python, который может генерировать исключения в разных местах.В каждом из них я хотел бы записать конкретное сообщение и выйти из программы.Чтобы сделать это, я вызываю SystemExit после перехвата исключения и его обработки (выполнения определенных операций ведения журнала и т. Д.).

В вызове main верхнего уровня я делаю следующее:

if __name__ == "__main__":
    try:
        main()
    except SystemExit:  # handled exception
        sys.exit(1)
    except:  # any unhandled exception
        logging.error('Unexpected error: ', exc_info=True)
        sys.exit(2)

Тем не менее, использование голых, кроме как что-то осуждается.Использует ли «дерево исключений», где я использую голые, кроме как для указания «что-нибудь, кроме исключений, которые я обработал» нестандартным способом?Есть ли лучший способ добиться этого?Я все еще хотел бы регистрировать эти необработанные исключения, даже если они не были обработаны.

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

Основная причина, по которой я спрашиваю это, заключается в том, что PEP8, похоже, рассматривает использование голого, кроме как ошибки, и хотя я мог бы использовать кромеBaseException, это должно быть просто синтаксическая разница.Является ли один способ более стандартным, чем другой, или есть другой стандартный путь достижения этого?

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Основная проблема с голым исключением состоит в том, что он может отлавливать такие вещи, как SystemExit и KeyboardInterrupt, которые не являются стандартными ошибками «кода» и обычно не должны обрабатываться так же, как исключение, сгенерированное вашим кодом.Использование класса Exception не охватывает эти случаи, поскольку они не наследуются от него, поэтому это больше, чем синтаксическая разница.

https://docs.python.org/2/howto/doanddont.html#except https://docs.python.org/3.1/howto/doanddont.html#except

Если выЕсли вы хотите обработать эти конкретные случаи, то лучше сделать это явно, как вы это сделали для SystemExit.

0 голосов
/ 03 декабря 2018

Голые исключения перехватывают вещи, которые вы не хотите перехватывать, например GeneratorExit.Сделайте это так:

except Exception as details:
    logging.error('Unexpected error: {0}'.format(details))
...