python - путаница, как работает ключевое слово "as" в операторе исключения - PullRequest
0 голосов
/ 13 февраля 2019

В общем, я пытался понять, как работает ключевое слово "as" в python, и изучил 3 случая для него

Случай 1: import foo as bar

Случай 2:with foo() as bar:

Случай 3: except Exception as e:

Я понимаю, как работают первые два случая, случай 1 назначает имя пакета другому имени, случай 2 работает с использованием __entry__ и__exit__ методы внутри класса (скажем, для обеспечения закрытия ресурсов), где __entry__ возвращает класс, которому назначается bar.

Однако, случай 3 кажется другим, я просматривал документы, которыеказалось, не помогло и не могло найти много объяснений нигде.В этом случае Exception.args работает иначе, чем e.args, и я пытался выяснить, как это работает за кулисами, то есть какие бы методы ни вызывались, или почему он ведет себя по-другому

Ответы [ 4 ]

0 голосов
/ 13 февраля 2019

Вызов e.args означает, что вы можете получить доступ к атрибутам объекта исключения.Но он не будет ловить BaseException SystemExit KeyboardInterrupt и GeneratorExit

try:
    i = 1/0
    print(i)
except Exception as e:
    print (e.args)

Это напечатает:

('division by zero')

Больше когда-либо Если мы rasie BaseException ошибка

try:
    raise BaseException()
except Exception as e:
    print (e.args)

Вывод будет таким:

runfile('W:/Summerizer/except.py', wdir='W:/Summerizer')
Traceback (most recent call last):

  File "<ipython-input-3-11e8f07e28c7>", line 1, in <module>
    runfile('W:/Summerizer/except.py', wdir='W:/Summerizer')

  File "C:\Users\adodhiwala\AppData\Local\conda\conda\envs\py35\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 668, in runfile
    execfile(filename, namespace)

  File "C:\Users\adodhiwala\AppData\Local\conda\conda\envs\py35\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 108, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "W:/Summerizer/except.py", line 10, in <module>
    raise BaseException()

BaseException

Здесь as используется для доступа к большему количеству функций (аргументы, сообщения и т. Д.), Чтобы вы могли более эффективно понимать ошибки.

0 голосов
/ 13 февраля 2019

Попробуйте выполнить это, что должно прояснить ситуацию.

try:
    zero = 0
    b = 1.0 / zero
except ArithmeticError as e:
    print( "Runtime error: ", e)

ArithmeticError - это класс исключений Python, который нужно перехватить.e является экземпляром этого класса, в данном случае подкласс ZeroDivisionError.

0 голосов
/ 13 февраля 2019

В операторе исключений для привязки имени к передаваемому исключению используется ключевое слово as.

Использование as - единственный способ назначить исключение локальному в Python 3.x,Но это не обязательно.

В Python 2.6+ у нас было 2 варианта , и as.поскольку , является неоднозначным в случае мультипатча, который позволяет перехватывать несколько исключений в одном блоке кроме.as является предпочтительным вариантом.

В Python 2.5 и более ранних версиях мы используем , для ассоциации, поскольку as не поддерживается.

0 голосов
/ 13 февраля 2019

Фраза except A as b: гласит, что в приведенном выше предложении try должны быть перехвачены все исключения класса A (или его подкласса).Фактически пойманное исключение будет видно в переменной b затем.

try:
  raise KeyError('example')
except LookupError as problem:
  print("I caught %r as problem." % problem)

Это напечатает

I caught KeyError('example',) as problem.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...