#python #python-3.x
Вопрос:
В приведенном ниже коде
>>> try:
... a = 12 / 0
... except Exception as e:
... print(e)
...
division by zero
>>>
Google говорит: « as
ключевое слово используется для создания псевдонима».
Тогда почему этот приведенный ниже код не работает?
>>> try:
... a = 12 / 0
... except Exception:
... print(Exception)
...
<class 'Exception'>
>>>
Согласно некоторым источникам, он создает объект Exception
класса.
Тогда почему следующий код ничего не печатает?
>>> try:
... a = 12 / 0
... except Exception:
... a = Exception()
... print(a)
...
>>>
Мои вопросы таковы:
- Если
as
ключевое слово действует как псевдоним, почему второй пример не сработал (вместо ошибки печати в нем была напечатана ссылка наException
класс)? - Если
as
ключевое слово создает объектException
класса, почему третий пример не сработал (вместо печати ошибки он ничего не напечатал)?
Комментарии:
1.
as e
связывает вызванное исключение сe
.Exception
является классом исключений. Так что , хотяe
это может быть примеромException
, это вряд ли одно и то же.Exception()
просто создает экземплярException
класса и не имеет ничего общего с ранее возникшим исключением.2. Google не является арбитром Python — цитата, похоже, взята из wwwschools, а не из такого авторитетного источника, как docs.python.org .
Ответ №1:
Вы неправильно истолковываете ссылку. as
Ключевое слово используется для создания псевдонима, но только в import
инструкции. Его значение с except
совершенно другим. В этом случае он просто объявляет переменную, которая будет содержать объект исключения. Если вы скажете except Exception as e
, то e
будет объект типа Exception
.
В вашем последнем примере:
try:
a = 12/0
except Exception:
a = Exception()
print(a)
Вы не фиксируете исключение, которое было выдано. Вместо этого вы создаете совершенно новый вариант исключения. Такой объект еще не содержит исключения, поэтому ничего не печатается. Если вы хотите, чтобы было перехвачено исключение, вы должны использовать это as
предложение.
Комментарии:
1. Я бы просто добавил, что
e
это экземпляр типаException
или подклассаException
2. Почему «или подкласс» ? Разве это не
e
экземпляр и только экземплярException
класса?3. @accdias
except Exception as e:
улавливает любое исключение , являющееся экземпляромException
или любым подклассомException
, практически каждое встроенное исключение является подклассомException
, поэтому оно будет улавливать все исключения иe
будет экземпляром любого возникшего исключения4. О! Теперь я понял. Я совсем забыл, что
Exception
у этого есть подклассы.