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

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

In [49]: try: 
    ...:     open('file.DNE.txt') 
    ...: except Exception as  e: 
    ...:     print(dir(e)) 
    ...:                                                                                                                                    
['__cause__', '__class__', '__context__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__suppress_context__', '__traceback__', 'args', 'characters_written', 'errno', 'filename', 'filename2', 'strerror', 'with_traceback']

Есть много "вещей", к которым можно получить доступ, используя синтаксис as e.

Этот код был предназначен исключительно для отображения деталей этого экземпляра.

Использование второй формы дает вам переменную (названную на основе as оговорка, в вашем примере e) в except заблокируйте область видимости с привязанным к ней объектом исключения, чтобы вы могли использовать информацию в исключении (тип, сообщение, трассировка стека и т. д.) для обработки исключения в более специально подобранной усадьбе.

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

Другие вопросы по тегам