Подтвердить что ты не робот

Разница между исключением: и исключение 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

В чем же разница в обеих конструкциях?

4b9b3361

Ответ 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 принимает только исключение. Кроме: это блок. он принимает исключение и обрабатывает исключение. и выполнен.