Обрабатывать определенный тип исключения в Python - PullRequest
17 голосов
/ 02 декабря 2010

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

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

Поэтому я не хочу просто добавлять:

except KeyboardInterrupt:
    sys.exit()

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

Ответы [ 7 ]

22 голосов
/ 02 декабря 2010

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

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

try:
    stuff()
except Exception as e:
    if _debug and isinstance(e, KeyboardInterrupt):
        sys.exit()
    logger.exception("Normal handling")
20 голосов
/ 02 декабря 2010

Это в значительной степени так, как это делается.

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

Там минимальное повторение.Однако не ноль, а минимум.

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

1 голос
/ 02 декабря 2010

Вы должны позволить 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
0 голосов
/ 02 декабря 2010

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

try:
    stuff()
except KeyboardInterrupt:
    sys.exit()
except Exception:
    normal_handling()
0 голосов
/ 02 декабря 2010
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")
0 голосов
/ 02 декабря 2010

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

try:
    stuff()
except Exception as e:
   if _debug and isinstance(e, KeyboardInterrupt):
        sys.exit()
    logging.exception("Normal handling")
0 голосов
/ 02 декабря 2010

Что не так с

try:
    stuff()
except KeyboardInterrupt:
    if _debug:
        logging.exception("Debug handling")
        sys.exit()
    else:
        logging.exception("Normal handling")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...