2
votes

python - confusion sur le fonctionnement du mot-clé "as" dans une instruction except

J'ai essayé de comprendre en général comment le mot-clé "as" en python fonctionne jusqu'à présent et j'ai appris 3 cas pour cela

Cas 1: importer foo comme barre

Cas 2: avec foo () comme barre:

Cas 3: sauf exception comme e:

Je comprends comment les 2 premiers cas fonctionnent, le cas 1 fonctionne en attribuant un nom de package à un nom différent, le cas 2 fonctionne en utilisant les méthodes __entry__ et __exit__ dans une classe ( dire pour assurer la fermeture des ressources), où __entry__ renvoie la classe à laquelle bar est assignée.

Cependant, le cas 3 semble différent, je regardais à travers les documents qui ne semblaient pas aider et je n'ai trouvé aucune explication nulle part. Dans ce cas, Exception.args fonctionne différemment de e.args et j'ai essayé de comprendre comment cela fonctionne dans les coulisses, c'est-à-dire quelles que soient les méthodes appelées, ou pourquoi il se comporte différemment


3 commentaires

Exception est la classe d'exception et e est l'exception objet .


Ce as e attribue essentiellement le nom e à l'instance de l'exception qui a été interceptée, afin que vous puissiez vous y référer (par exemple pour la journalisation) dans le sauf le bloc .


Voir docs.python.org/3/reference/…


4 Réponses :


2
votes

La phrase sauf A comme b: indique que dans la clause try ci-dessus, toutes les exceptions de la classe A (ou une sous-classe de celle-ci) sont être attrapé. L'exception réellement interceptée sera alors visible dans la variable b .

I caught KeyError('example',) as problem.

Cela s'affichera

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


2 commentaires

Ahh je vois, cela a un peu plus de sens, donc le b dans ce cas attrape juste un objet de cette classe, et vous ne pouvez pas imprimer LookupError seul non initialisé dans ce cas si je comprends bien


@NightShade Oui. LookupError dans mon exemple est un objet class tandis que problem est un objet instance . Le premier est le type, le second une valeur de ce type. (En quelque sorte.)



0
votes

Essayez d'exécuter ceci, ce qui devrait clarifier les choses.

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

ArithmeticError est une classe d'exception Python à intercepter. e est une instance de cette classe, dans ce cas la sous-classe ZeroDivisionError.


0 commentaires

2
votes

Dans l'instruction except pour associer un nom à l'exception en cours de transmission, le mot clé as est utilisé.

Utiliser comme est le seul moyen d'attribuer l'exception à un local dans Python 3.x. Mais ce n'est pas obligatoire.

Dans Python 2.6+, nous avions 2 options , et comme . depuis , est ambigu en cas de multicatch, ce qui vous permet d'attraper plusieurs exceptions dans un bloc excepté. as est l'option préférée.

Dans Python 2.5 et versions antérieures, nous utilisons le , pour l'association, puisque as n'est pas pris en charge.


0 commentaires

0
votes

L'appel de e.args signifie que vous pouvez accéder aux attributs de l'objet d'exception. Mais il n'attrapera pas BaseException SystemExit KeyboardInterrupt et GeneratorExit

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

Cela affichera:

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

Plus jamais Si nous rasons l'erreur BaseException

('division by zero')

La sortie sera comme ceci

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

Ici comme est utilisé pour accéder à plus de fonctions (arguments, message, etc.) afin que vous puissiez comprendre l'erreur plus efficacement.


0 commentaires