Я бы хотел обработать одно конкретное исключение в моем скрипте в одном месте, не прибегая к try
/ exception
каждый раз *. Я надеялся, что код ниже сделает это:
import sys
def handle(exc_type, exc_value, exc_traceback):
if issubclass(exc_type, ValueError):
print("ValueError handled here and the script continues")
return
# follow default behaviour for the exception
sys.__excepthook__(exc_type, exc_value, exc_traceback)
sys.excepthook = handle
print("hello")
raise ValueError("wazaa")
print("world")
a = 1/0
Идея заключалась в том, что ValueError
будет обрабатываться "вручную", и сценарий будет продолжаться (return
к сценарию). В случае любой другой ошибки (ZeroDivisionError
в приведенном выше случае) последует нормальная трассировка и аварийное завершение работы скрипта.
Что происходит, это
$ python scratch_13.py
hello
ValueError handled here and the script continues
Process finished with exit code 1
Документация упоминает, что (выделено мной)
Когда исключение возникает и не обрабатывается, переводчик вызывает
sys.excepthook
с тремя аргументами, класс исключения, исключение
экземпляр и объект трассировки. В интерактивном сеансе это
происходит непосредственно перед возвратом управления в подсказку; в Питоне
Программа это происходит перед самым выходом из программы .
что означало бы, что когда я нахожусь в handler()
, уже слишком поздно, поскольку сценарий все равно решил умереть, и моя единственная возможность - повлиять на то, как будет выглядеть трассировка.
Есть ли способ игнорировать определенное исключение глобально в скрипте?
* это для контекста отладки, где обычно вызывается исключение и происходит сбой сценария (в работе), но в некоторых конкретных случаях (например, на платформе dev) это конкретное исключение должно просто быть отброшенным В противном случае я бы поместил предложение try
/ exception
везде, где могла бы возникнуть проблема.