Разница между 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 74

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

исключение означает ошибку. чтобы найти ошибки во время выполнения.для обработки ошибок времени выполнения, называется обработкой исключений. он имеет два блока пытаться кроме пытаться: это блок. он принимает только исключение. кроме: это блок. он принимает исключение и обрабатывает исключение. и казнили.