Разница между исключением: и исключением исключения как 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 принимает только исключение. кроме: это блок. это исключение и обработка исключения. и выполнен.