Возрождение исключений

Иногда вы хотите поймать исключение только для его проверки, например, в целях регистрации. После проверки вы хотите, чтобы исключение продолжало распространяться, как и раньше.

В этом случае, просто используйте raise заявление без каких - либо параметров.

 try:
    5 / 0
except ZeroDivisionError:
    print("Got an error")
    raise

 

Имейте в виду, однако, что кто-то еще выше в стеке вызовов может все же перехватить исключение и как-то обработать его. Готовый вывод может быть неприятным в этом случае, потому что это произойдет в любом случае (пойман или не пойман). Поэтому может быть лучше создать другое исключение, содержащее ваш комментарий о ситуации, а также исходное исключение:

 try:
    5 / 0
except ZeroDivisionError as e:
    raise ZeroDivisionError("Got an error", e)

 

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

В Python 3 вы можете сохранить первоначальный стек с помощью raise - from синтаксисом:

     raise ZeroDivisionError("Got an error") from e