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
4 Réponses :
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)
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.)
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.
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.
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.
Exceptionest la classe d'exception eteest l'exception objet .Ce
as eattribue essentiellement le nomeà 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 lesauf le bloc.Voir docs.python.org/3/reference/… a>