Обработка определенного типа исключения в 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()