Разница между исключением: и исключение Exception как e: в Python
Оба следующих фрагмента кода делают то же самое. Они получают каждое исключение и выполняют код в блоке 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
В чем же разница в обеих конструкциях?
Ответы
Ответ 1
Во втором вы можете получить доступ к атрибутам объекта исключения:
>>> def catch():
... try:
... asd()
... except Exception as e:
... print e.message, e.args
...
>>> catch()
global name 'asd' is not defined ("global name 'asd' is not defined",)
Но он не улавливает BaseException
или исключающие систему исключения SystemExit
, KeyboardInterrupt
и GeneratorExit
:
>>> def catch():
... try:
... raise BaseException()
... except Exception as e:
... print e.message, e.args
...
>>> catch()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in catch
BaseException
Какой голый, кроме:
>>> def catch():
... try:
... raise BaseException()
... except:
... pass
...
>>> catch()
>>>
Смотрите раздел Встроенные исключения в документах и Ошибки и Исключения в учебнике для получения дополнительной информации.
Ответ 2
except:
принимает все исключения, тогда как
except Exception as e:
принимает только исключения, которые вы должны поймать.
Вот пример того, что вы не собираетесь ловить:
>>> try:
... input()
... except:
... pass
...
>>> try:
... input()
... except Exception as e:
... pass
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
KeyboardInterrupt
Первый отключил KeyboardInterrupt
!
Вот быстрый список:
issubclass(BaseException, BaseException)
#>>> True
issubclass(BaseException, Exception)
#>>> False
issubclass(KeyboardInterrupt, BaseException)
#>>> True
issubclass(KeyboardInterrupt, Exception)
#>>> False
issubclass(SystemExit, BaseException)
#>>> True
issubclass(SystemExit, Exception)
#>>> False
Если вы хотите поймать любой из них, лучше всего сделать
except BaseException:
чтобы указать, что вы знаете, что делаете.
Все исключения связаны с BaseException
, а те, которые вы собираетесь ежедневно ловить (те, которые будут выбраны для программиста), наследуются также от Exception
.
Ответ 3
Существуют различия с некоторыми исключениями, например. KeyboardInterrupt.
Чтение PEP8:
Голый, кроме: предложение будет ловить SystemExit и KeyboardInterrupt исключений, затрудняя прерывание программы с помощью Control-C, и может маскировать другие проблемы. Если вы хотите поймать все исключения что ошибки сигнальной программы, используйте исключение Исключение: (голый кроме эквивалентно исключению BaseException:).
Ответ 4
Использование второй формы дает вам переменную (названную в соответствии с предложением as
в вашем примере e
) в области блока except
с привязанным к ней объектом исключения, чтобы вы могли использовать информацию в исключение (тип, сообщение, трассировка стека и т.д.), чтобы обработать исключение в специально специально укомплектованной усадьбе.
Ответ 5
исключение означает ошибку.
к обнаружению ошибок во время выполнения. Обработка ошибок во время выполнения называется обработкой исключений.
он имеет два блока
пытаться
Кроме
пытаться:
это блок .it принимает только исключение.
Кроме:
это блок.
он принимает исключение и обрабатывает исключение.
и выполнен.