Python permet la gestion des exceptions :
>>> 10/0 Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: integer division or modulo by zero
Ci-dessus, une exception de type ZeroDivisionError a été levée.
L'exception ci-dessus levée interrompera le programme, à moins d'être capturée, comme suit :
>>> try: ... 10/0 ... except ZeroDivisionError : ... print "On ne divise pas par 0" ... On ne divise pas par 0
Auquel cas, le programme peut se poursuivre. A noter que l'on peut mettre plusieurs exceptions à la suite.
Lorsqu'une erreur se produit dans un appel de fontion, elle remonte toutes les couches de code, et le traceback est affiché :
>>> def toto(): ... return tata() ... >>> def tata(): ... return tutu() ... >>> def tutu(): ... 10/0 ... >>> toto() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in toto File "<stdin>", line 2, in tata File "<stdin>", line 2, in tutu ZeroDivisionError: integer division or modulo by zero
Si l'exception levée n'est interceptée par aucune fonction, alors le programme se termine par le message d'erreur levé. Sinon, le programme se poursuit, après avoir géré l'exception comme on lui a dit de faire.
On peut soit-même lever des exceptions, avec le mot-clé raise :
>>> def division(x,y): ... if y == 0 : ... raise ZeroDivisionError ... return x/y ... >>> division(1,0) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in division ZeroDivisionError >>> division(1,1) 1
Les variables à l'origine des exceptions peuvent être récupérées, comme suit :
>>> try: ... division(1, 0) ... except ValueError, x: ... print "Vous avez voulu diviser ", x, "par 0" ... Vous avez voulu diviser 1 par 0
finally permet de s'assurer qu'une portion de code particulière est bien exécutée, même si le programme provoque une erreur. Cette fonctionnalité permet de terminer proprement certaines opérations comme des écritures de fichiers ou des échanges réseaux...
>>> f = open('coucou.txt','w') >>> try : ... f.write('coucou') ... finally : ... f.close() ...
finally est toujours visité, même si un return est placé dans le bloc protégé. Dans ce cas, finally est visité juste avant que la fonction ou la méthode rende la main.