Как ключевое слово » as » работает при обработке исключений?

#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)
... 

>>> 
 

Мои вопросы таковы:

  1. Если as ключевое слово действует как псевдоним, почему второй пример не сработал (вместо ошибки печати в нем была напечатана ссылка на Exception класс)?
  2. Если 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 у этого есть подклассы.