Оба следующих фрагмента кода делают одно и то же. Они ловят каждое исключение и выполняют код в except:
блоке
Фрагмент 1 -
try:
#some code that may throw an exception
except:
#exception handling code
Фрагмент 2 -
try:
#some code that may throw an exception
except Exception as e:
#exception handling code
В чем разница в обеих конструкциях?
python
python-3.x
narendranathjoshi
источник
источник
except Exception, e:
иexcept Exception as e:
. Этот вопрос спрашивает, в чем разница междуexcept:
иexcept Exception as e:
.Ответы:
Во втором вы можете получить доступ к атрибутам объекта исключения:
Но это не ловит
BaseException
или системные исключенияSystemExit
,KeyboardInterrupt
иGeneratorExit
:Который голый кроме делает:
См. Раздел « Встроенные исключения » документации и раздел « Ошибки и исключения » данного руководства для получения дополнительной информации.
источник
Exception
происходит отBaseException
, поэтомуexcept Exception
не ловитBaseException
. Если ты напишешьexcept BaseException
, его тоже поймают. Голыйexcept
просто ловит все.except
должно быть последним в серииexcept
блоков, в то время как вы не получите ошибку, если поместитеexcept Exception
перед другимиexcept
блоками: они будут просто игнорироваться (если они обрабатываютException
подклассы). Что-то, на что нужно обратить внимание.except
иexcept Exception
. «Что-то, на что нужно обратить внимание» теперь выглядит немного странно, но в то время я ожидал, что Python выберет самый специфическийexcept
блок, независимо от того, где он был, и был немного разочарован, узнав иначе.принимает все исключения, тогда как
принимает только те исключения, которые вы должны поймать.
Вот пример того, что вы не должны ловить:
Первый заставил замолчать
KeyboardInterrupt
!Вот краткий список:
Если вы хотите поймать любой из них, лучше сделать
указать, что вы знаете, что делаете.
Все исключения проистекают из
BaseException
тех, которые вы должны поймать изо дня в день (те, которые будут выброшены для программиста)Exception
.источник
except(Exception)
никогда не ловитKeyboardInterrupt
ошибки.as e
не имеет к этому никакого отношения.as e
, потому что предположил, что это очевидно.SystemExit
илиKeyboardInterrupt
от которых скрывались. Не частый случай, но это случается.Существуют различия с некоторыми исключениями, например, KeyboardInterrupt.
Чтение PEP8 :
источник
Использование второй формы дает вам переменную (названную в соответствии с
as
предложением в вашем примереe
) в областиexcept
блока с привязанным к ней объектом исключения, так что вы можете использовать информацию в исключении (тип, сообщение, трассировка стека и т. Д.) Для обработать исключение в более специально подобранной усадьбе.источник
Еще один способ взглянуть на это. Проверьте детали исключения:
Есть много «вещей» для доступа с использованием синтаксиса «как e».
Этот код был предназначен исключительно для показа деталей этого экземпляра.
источник