Обработка определенного типа исключения в python

У меня есть код, который обрабатывает исключение, и я хочу сделать что-то конкретное, только если это конкретное исключение и только в режиме отладки. Так, например:

try:
    stuff()
except Exception as e:
    if _debug and e is KeyboardInterrupt:
        sys.exit()
    logging.exception("Normal handling")

Как таковой, я не хочу просто добавлять a:

except KeyboardInterrupt:
    sys.exit()

потому что я пытаюсь сохранить разницу в этом минимальном отладочном коде

Ответы

Ответ 1

Ну, действительно, вы, вероятно, должны оставить обработчик для KeyboardInterrupt отделенным. Почему вы только хотите обрабатывать прерывания клавиатуры в режиме отладки, но проглатываете их в противном случае?

Тем не менее, вы можете использовать isinstance для проверки типа объекта:

try:
    stuff()
except Exception as e:
    if _debug and isinstance(e, KeyboardInterrupt):
        sys.exit()
    logger.exception("Normal handling")

Ответ 2

Это почти так, как это было сделано.

try:
    stuff()
except KeyboardInterrupt:
    if _debug:
        sys.exit()
    logging.exception("Normal handling")
except Exception as e:
    logging.exception("Normal handling")

Там минимальное повторение. Но не ноль, но минимальный.

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

Ответ 3

Вы должны позволить пузырьку KeyboardInterrupt полностью подняться и захватить его на самом высоком уровне.

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        sys.exit()
    except:
        pass

def main():
    try:
        stuff()
    except Exception as e:
        logging.exception("Normal handling")
        if _debug:
            raise e

Ответ 4

Что случилось с

try:
    stuff()
except KeyboardInterrupt:
    if _debug:
        logging.exception("Debug handling")
        sys.exit()
    else:
        logging.exception("Normal handling")

Ответ 5

Используйте стандартный метод, упомянутый в других ответах, или если вы действительно хотите протестировать в блоке исключений, вы можете использовать isinstance().

try:
    stuff()
except Exception as e:
   if _debug and isinstance(e, KeyboardInterrupt):
        sys.exit()
    logging.exception("Normal handling")

Ответ 6

try:
    stuff()
except KeyboardInterrupt:
    if _debug:
        sys.exit()
    logging.exception("Normal handling")
except ValueError:
    if _debug:
        sys.exit()
    logging.exception("Value error Normal handling")
else:
    logging.info("One more message without exception")

Ответ 7

Вы можете указать определенные исключения в Python:

try:
    stuff()
except KeyboardInterrupt:
    sys.exit()
except Exception:
    normal_handling()