271 votes

Différence entre sauf : et sauf Exception comme e :

Les deux extraits de code suivants font la même chose. Ils attrapent toutes les exceptions et exécutent le code dans la section except: bloc

Extrait 1 -

try:
    #some code that may throw an exception
except:
    #exception handling code

Extrait 2 -

try:
    #some code that may throw an exception
except Exception as e:
    #exception handling code

Quelle est la différence entre les deux concepts ?

294voto

agf Points 45052

Dans la seconde, vous pouvez accéder aux attributs de l'objet d'exception :

>>> def catch():
...     try:
...         asd()
...     except Exception as e:
...         print e.message, e.args
... 
>>> catch()
global name 'asd' is not defined ("global name 'asd' is not defined",)

Mais il n'attrape pas BaseException ou les exceptions qui sortent du système SystemExit , KeyboardInterrupt et GeneratorExit :

>>> def catch():
...     try:
...         raise BaseException()
...     except Exception as e:
...         print e.message, e.args
... 
>>> catch()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in catch
BaseException

Ce qui est le cas d'un simple sauf-conduit :

>>> def catch():
...     try:
...         raise BaseException()
...     except:
...         pass
... 
>>> catch()
>>> 

Voir le Exceptions intégrées de la documentation et la section Erreurs et exceptions du tutoriel pour plus d'informations.

95voto

Veedrac Points 11712
except:

accepte tous exceptions, alors que

except Exception as e:

n'accepte que les exceptions pour lesquelles vous êtes signifié à attraper.

Voici un exemple de ce que vous n'êtes pas censé attraper :

>>> try:
...     input()
... except:
...     pass
... 
>>> try:
...     input()
... except Exception as e:
...     pass
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
KeyboardInterrupt

Le premier a fait taire les KeyboardInterrupt !

En voici une liste rapide :

issubclass(BaseException, BaseException)
#>>> True
issubclass(BaseException, Exception)
#>>> False

issubclass(KeyboardInterrupt, BaseException)
#>>> True
issubclass(KeyboardInterrupt, Exception)
#>>> False

issubclass(SystemExit, BaseException)
#>>> True
issubclass(SystemExit, Exception)
#>>> False

Si vous voulez attraper l'un d'entre eux, il est préférable de le faire

except BaseException:

pour souligner que vous savez ce que vous faites.


Tous Les exceptions découlent de BaseException et ceux que vous êtes censé attraper au jour le jour (ceux qui seront jetés). pour le programmeur) héritent aussi de Exception .

21voto

Diego Herranz Points 2557

Il existe des différences à quelques exceptions près, par exemple KeyboardInterrupt.

Lecture PEP8 :

Une clause except : simple permet d'attraper les exceptions SystemExit et KeyboardInterrupt ce qui rend plus difficile l'interruption d'un programme avec Control-C, et peut masquer d'autres problèmes. Si vous voulez attraper toutes les exceptions qui signalent des erreurs de programme, utilisez except Exception : (bare except est équivalent à except BaseException :). équivalent à except BaseException :).

8voto

jouell Points 850

Une autre façon de voir les choses. Vérifiez les détails de l'exception :

In [49]: try: 
    ...:     open('file.DNE.txt') 
    ...: except Exception as  e: 
    ...:     print(dir(e)) 
    ...:                                                                                                                                    
['__cause__', '__class__', '__context__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__suppress_context__', '__traceback__', 'args', 'characters_written', 'errno', 'filename', 'filename2', 'strerror', 'with_traceback']

Il existe de nombreuses "choses" auxquelles on peut accéder en utilisant la syntaxe "as e".

Ce code était uniquement destiné à montrer les détails de cette instance.

5voto

Silas Ray Points 11950

L'utilisation du deuxième extrait vous permet d'obtenir une variable (nommée en fonction de l'élément as Dans votre exemple, la clause e ) dans le except avec l'objet d'exception qui lui est lié afin que vous puissiez utiliser les informations contenues dans l'exception (type, message, trace de pile, etc.) pour traiter l'exception d'une manière plus spécialement adaptée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X