Исключение ре-рейза / повторной записи Python - PullRequest
12 голосов
/ 10 июня 2011

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

Вот как бы это выглядело "

try:
   something
except SpecificError as ex:
   if str(ex) = "some error I am expecting"
      print "close softly"
   else:
      raise
except Exception as ex:
   print "did not close softly"
   raise

Я хочу, чтобы повышение в предложении else вызывало финал, кроме оператора.

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

Я полагаю, что одним из решений было бы создание функции, если она не закрывается мягко, что вызывается в final, кроме как и в предложении else. Но это кажется ненужным.

Ответы [ 4 ]

18 голосов
/ 10 июня 2011

Как насчет записи 2 попытки ... кроме блоков вроде этого:

try:
    try:
       something
    except SpecificError as ex:
       if str(ex) == "some error I am expecting"
          print "close softly"
       else:
          raise ex
except Exception as ex:
   print "did not close softly"
   raise ex
16 голосов
/ 10 июня 2011

Вызывается только одно предложение except в блоке try. Если вы хотите, чтобы исключение было зафиксировано выше, вам нужно использовать вложенные блоки try.

1 голос
/ 10 июня 2011

Согласно питону учебник есть одно и только одно отловленное исключение для одного оператора try. Вы можете найти довольно простой пример в учебнике, который также покажет вам, как правильно использовать форматирование ошибок.

В любом случае, зачем тебе второй? Не могли бы вы предоставить более подробную информацию об этом?

0 голосов
/ 03 июля 2018

Вы можете сделать это, используя пакет six.

Six предоставляет простые утилиты для переноса различий между Python 2 и Python 3.

В частности, см. six.reraise:

Вызвать исключение, возможно, с другой трассировкой. В простом случае reraise(*sys.exc_info()) с активным исключением (в блоке исключений) вызывает текущее исключение с последней трассировкой. Другой параметр трассировки можно указать с помощью параметра exc_traceback. Обратите внимание, что, поскольку переопределение исключений выполняется в функции reraise(), Python присоединит фрейм вызова reraise() к любой вызванной трассировке.

...