Разница между except: и except 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
в чем именно разница в конструкции?
5 ответов:
во втором вы можете получить доступ к атрибутам объекта исключения:
>>> 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() >>>
посмотреть встроенные исключения раздел документов и ошибки и исключения раздел учебника для получения дополнительной информации.
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
.
есть различия с некоторыми исключениями, например KeyboardInterrupt.
чтение PEP8:
голый за исключением: предложение будет ловить SystemExit и KeyboardInterrupt исключения, затрудняющие прерывание программы с помощью Control-C, и может замаскировать другие проблемы. Если вы хотите поймать все исключения этот сигнал ошибки программы, использовать за исключением исключения: (голый за исключением эквивалентно исключение BaseException:).
использование второй формы дает вам переменную (названную на основе
as
предложение, в вашем примереe
) вexcept
область блока с объектом исключения, привязанным к нему, чтобы вы могли использовать информацию в исключении (тип, сообщение, трассировка стека и т. д.) Для обработки исключения в более специально подобранном поместье.
исключение означает ошибку. чтобы найти ошибки во время выполнения.для обработки ошибок времени выполнения, называется обработкой исключений. он имеет два блока пытаться кроме пытаться: это блок. он принимает только исключение. кроме: это блок. он принимает исключение и обрабатывает исключение. и казнили.