Как обработать конкретное необработанное исключение? - PullRequest
0 голосов
/ 09 мая 2018

Я бы хотел обработать одно конкретное исключение в моем скрипте в одном месте, не прибегая к 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 везде, где могла бы возникнуть проблема.

1 Ответ

0 голосов
/ 09 мая 2018

Один из способов сделать это - использовать contextlib.suppress и иметь глобальный кортеж исключенных исключений:

 suppressed = (ValueError,)

И затем в любом месте, где может произойти ошибка, вы просто заключаете ее в with suppress(*suppressed):

print("hello")
with suppress(*suppressed): # gets ignored
    raise ValueError("wazaa")
print("world")
a = 1/0 # raise ZeroDivisionError

И тогда в производстве вы просто меняете suppressed на ():

suppressed = ()
print("hello")
with suppress(*suppressed):
    raise ValueError("wazaa") # raises the error
print("world")
a = 1/0 # doesn't get executed

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...