Разница между 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область блока с объектом исключения, привязанным к нему, чтобы вы могли использовать информацию в исключении (тип, сообщение, трассировка стека и т. д.) Для обработки исключения в более специально подобранном поместье.
исключение означает ошибку. чтобы найти ошибки во время выполнения.для обработки ошибок времени выполнения, называется обработкой исключений. он имеет два блока пытаться кроме пытаться: это блок. он принимает только исключение. кроме: это блок. он принимает исключение и обрабатывает исключение. и казнили.