Python: поймать неперехваченное исключение, но не выйти сразу

из стандартной библиотеки для модуля sys

sys.excepthook (тип, значение, трассировка)

Эта функция выводит заданную трассировку и исключение в sys.stderr.

Когда возникает и не перехватывается исключение, интерпретатор вызывает sys.excepthook с тремя аргументами: классом исключения, экземпляром исключения и объектом трассировки. В интерактивном сеансе это происходит непосредственно перед тем, как управление будет возвращено подсказке; в программе Python это происходит непосредственно перед выходом из программы. Обработку таких исключений верхнего уровня можно настроить, назначив sys.excepthook еще одну функцию с тремя аргументами.

Есть ли способ перехватывать неперехваченные исключения без обязательного немедленного выхода после этого (в зависимости от процесса принятия решений)?

позже
Полагаю, что нет. Я полагаю, что BDFL, в своей мудрости, предлагает это как последнюю возможность спасти несколько крох от разваливающейся, нехорошей программы, прежде чем она рухнет в забвение, оставив после себя лишь несколько журналов.


person mike rodent    schedule 05.08.2015    source источник
comment
При использовании в вашей точке входа это может помочь: stackoverflow. ком/вопросы/4990718/   -  person Kenny Ostrom    schedule 05.08.2015


Ответы (1)


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

try:
  # do something

except Exception_Type:
  # do something else

except:
  # woops didn't count on that
person Obj3ctiv3_C_88    schedule 05.08.2015
comment
да, но, конечно, такой механизм можно было бы использовать вместо механизма sys.excepthook (если он заканчивается на exit()). Позвольте мне перефразировать мой вопрос: зачем вообще иметь элегантный способ ловли не пойманных? - person mike rodent; 05.08.2015
comment
@mikerodent Вы можете переопределить sys.excepthook, но обычно вам не следует возиться с неперехваченными исключениями. Uncaught означает, что все, к чему вы готовились, потерпело неудачу, и ваша программа больше не стабильна. Это потому, что только Бог знает, что произошло, чтобы вызвать исключение, и все средства, которые нужно сделать, делают это, не зная проблемы. Просто быстро например, утечка памяти. Возможно, вы не ожидали этого и, используя, вы предотвратили поведение по умолчанию (выход из программы), которое может повлиять на конечного пользователя. - person Obj3ctiv3_C_88; 05.08.2015
comment
Благодарность! См. мой добавленный комментарий... По сути, я согласен! - person mike rodent; 05.08.2015