Gestion des exceptions Python

Python fournit deux fonctionnalités très importantes pour gérer les exceptions et les erreurs qui se produisent pendant l'exécution des programmes Python. Vous pouvez utiliser ces fonctionnalités pour déboguer les programmes Python.

  • Gestion des exceptions : Le tutoriel Python de ce site la couvrira en détail.
  • Assertions : Le tutoriel Python de ce site les couvrira en détail.

Exceptions standard Python

Nom de l'exceptionDescription
BaseExceptionClasse de base pour toutes les exceptions
SystemExitSortie demandée par l'interpréteur
KeyboardInterruptInterruption de l'exécution par l'utilisateur (généralement en entrant ^C)
ExceptionClasse de base pour les erreurs générales
StopIteration L'itérateur n'a plus de valeurs
GeneratorExit Le générateur lève une exception pour signaler sa sortie
StandardErrorClasse de base pour toutes les exceptions standard intégrées
ArithmeticError Classe de base pour toutes les erreurs de calcul numérique
FloatingPointError Erreur de calcul en virgule flottante
OverflowErrorL'opération numérique dépasse la limite maximale
ZeroDivisionErrorDivision (ou modulo) par zéro (tous les types de données)
AssertionErrorÉchec de l'instruction d'assertion
AttributeErrorL'objet ne possède pas cet attribut
EOFError Aucune entrée intégrée, marqueur EOF atteint
EnvironmentError Classe de base pour les erreurs du système d'exploitation
IOError Échec de l'opération d'entrée/sortie
OSError Erreur du système d'exploitation
WindowsErrorÉchec de l'appel système
ImportError Échec de l'importation du module/de l'objet
LookupError Classe de base pour les requêtes de données non valides
IndexErrorAucun index de ce type dans la séquence
KeyErrorAucune clé de ce type dans la table de correspondance
MemoryErrorErreur de dépassement de mémoire (non fatale pour l'interpréteur Python)
NameErrorObjet non déclaré/non initialisé (aucun attribut)
UnboundLocalError Accès à une variable locale non initialisée
ReferenceErrorUne référence faible tente d'accéder à un objet qui a été collecté par le ramasse-miettes
RuntimeError Erreur d'exécution générale
NotImplementedErrorMéthode pas encore implémentée
SyntaxErrorErreur de syntaxe Python
IndentationErrorErreur d'indentation
TabErrorMélange de tabulations et d'espaces
SystemError Erreur système générale de l'interpréteur
TypeErrorOpération non valide sur le type
ValueError Argument non valide transmis
UnicodeError Erreurs liées à Unicode
UnicodeDecodeError Erreur lors du décodage Unicode
UnicodeEncodeError Erreur lors de l'encodage Unicode
UnicodeTranslateErrorErreur lors de la conversion Unicode
Avertissement Classe de base pour
DeprecationWarningAvertissement concernant des fonctionnalités obsolètes
FutureWarning Avertissement concernant des constructions dont la sémantique changera à l'avenir
OverflowWarningAncien avertissement concernant la promotion automatique vers long (long)
PendingDeprecationWarningAvertissement concernant des fonctionnalités qui seront obsolètes
RuntimeWarning Avertissement concernant une exécution suspecte
SyntaxWarningAvertissement concernant une syntaxe suspecte
UserWarningAvertissement généré par le code utilisateur

Qu'est-ce qu'une exception ?

Une exception est un événement qui se produit pendant l'exécution du programme et qui affecte l'exécution normale du programme.

En général, lorsque Python ne peut pas traiter un programme normalement, une exception se produit.

Les exceptions sont des objets Python qui représentent une erreur.

Lorsqu'une exception se produit dans un script Python, nous devons la capturer et la gérer, sinon le programme se terminera.


Gestion des exceptions

Vous pouvez capturer des exceptions à l'aide d'instructions try/except.

L'instruction try/except est utilisée pour détecter les erreurs dans le bloc try, afin que l'instruction except puisse capturer les informations sur l'exception et les gérer.

Si vous ne voulez pas que votre programme se termine lorsqu'une exception se produit, il suffit de la capturer dans un try.

Syntaxe :

La syntaxe simpletry....except...elseest la suivante :

try:
<语句>        #运行别的代码
except <名字>:
<语句>        #如果在try部份引发了'name'异常
except <名字>,<数据>:
<语句>        #如果引发了'name'异常,获得附加的数据
else:
<语句>        #如果没有异常发生

Le fonctionnement de try est que lorsqu'une instruction try est démarrée, Python place une marque dans le contexte du programme courant afin de pouvoir revenir ici lorsqu'une exception se produit. La clause try est exécutée en premier, et ce qui se passe ensuite dépend de si une exception se produit pendant l'exécution.

  • Si une exception se produit lorsque l'instruction après try s'exécute, Python revient à try et exécute la première clause except qui correspond à l'exception. Une fois l'exception traitée, le flux de contrôle traverse toute l'instruction try (sauf si une nouvelle exception est levée pendant le traitement de l'exception).
  • Si une exception se produit dans l'instruction après try mais qu'il n'y a pas de clause except correspondante, l'exception sera soumise au try de niveau supérieur, ou au niveau supérieur du programme (ce qui mettra fin au programme et affichera le message d'erreur par défaut).
  • Si aucune exception ne se produit pendant l'exécution de la clause try, Python exécutera l'instruction après l'instruction else (s'il y a un else), puis le flux de contrôle traverse toute l'instruction try.

Exemple

Voici un exemple simple qui ouvre un fichier, y écrit du contenu, et aucune exception ne se produit :

Exemple

#!/usr/bin/python
# -*- coding: UTF-8 -*-

try:
    fh = open("testfile", "w")
    fh.write("This is a test file for testing exceptions!!")
except IOError:
    print "Error: File not found or failed to read file"
else:
    print "Content written to file successfully"
    fh.close()

La sortie du programme ci-dessus est :

$ python test.py 
内容写入文件成功
$ cat testfile       # 查看写入的内容
这是一个测试文件,用于测试异常!!

Exemple

Voici un exemple simple qui ouvre un fichier, y écrit du contenu, mais le fichier n'a pas la permission d'écriture, donc une exception se produit :

Exemple

#!/usr/bin/python
# -*- coding: UTF-8 -*-

try:
    fh = open("testfile", "w")
    fh.write("This is a test file for testing exceptions!!")
except IOError:
    print "Error: File not found or failed to read file"
else:
    print "Content written to file successfully"
    fh.close()

Avant d'exécuter le code, pour faciliter les tests, nous pouvons d'abord supprimer le droit d'écriture du fichier testfile. La commande est la suivante :

chmod -w testfile

Exécutez ensuite le code ci-dessus :

$ python test.py 
Error: 没有找到文件或读取文件失败

Utilisation de except sans aucun type d'exception

Vous pouvez utiliser except sans aucun type d'exception, comme dans l'exemple suivant :

try:
    正常的操作
   ......................
except:
    发生异常,执行这块代码
   ......................
else:
    如果没有异常执行这块代码

De cette façon, l'instruction try-except attrape toutes les exceptions qui se produisent. Mais ce n'est pas une bonne approche, car nous ne pouvons pas identifier les informations spécifiques sur l'exception via le programme, puisqu'elle attrape toutes les exceptions.


Utilisation de except avec plusieurs types d'exceptions

Vous pouvez également utiliser la même instruction except pour gérer plusieurs messages d'exception, comme indiqué ci-dessous :

try:
    正常的操作
   ......................
except(Exception1[, Exception2[,...ExceptionN]]):
   发生以上多个异常中的一个,执行这块代码
   ......................
else:
    如果没有异常执行这块代码

Instruction try-finally

L'instruction try-finally exécute le code final, qu'une exception se produise ou non.

try:
<语句>
finally:
<语句>    #退出try时总会执行
raise

Exemple

Exemple

#!/usr/bin/python
# -*- coding: UTF-8 -*-

try:
    fh = open("testfile", "w")
    fh.write("This is a test file for testing exceptions!!")
finally:
    print "Error: File not found or failed to read file"

Si le fichier ouvert n'a pas le droit d'écriture, la sortie est la suivante :

$ python test.py 
Error: 没有找到文件或读取文件失败

Le même exemple peut également être écrit de la manière suivante :

Exemple

#!/usr/bin/python
# -*- coding: UTF-8 -*-

try:
    fh = open("testfile", "w")
    try:
        fh.write("This is a test file for testing exceptions!!")
    finally:
        print "Fermer le fichier"
        fh.close()
except IOError:
    print "Error: File not found or failed to read file"

Lorsqu'une exception est levée dans le bloc try, le code du bloc finally est exécuté immédiatement.

Une fois toutes les instructions du bloc finally exécutées, l'exception est à nouveau levée, et le code du bloc except est exécuté.

Le contenu du paramètre est différent de l'exception.


Arguments d'exception

Une exception peut transporter des arguments, qui peuvent être utilisés comme paramètres pour afficher les informations sur l'exception.

Vous pouvez intercepter les arguments d'une exception via l'instruction except, comme indiqué ci-dessous :

try:
    正常的操作
   ......................
except ExceptionType, Argument:
    你可以在这输出 Argument 的值...

La valeur d'exception reçue par la variable est généralement contenue dans l'instruction d'exception. La variable peut recevoir une ou plusieurs valeurs sous forme de tuple.

Le tuple contient généralement la chaîne d'erreur, le numéro d'erreur et l'emplacement de l'erreur.

Exemple

Voici un exemple d'une seule exception :

Exemple

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# Définir la fonction
def temp_convert(var):
    try:
        return int(var)
    except ValueError, Argument:
        print "L'argument ne contient pas de nombre"\n", Argument

# Appeler la fonction
temp_convert("xyz")

Le résultat de l'exécution du programme ci-dessus est le suivant :

$ python test.py 
参数没有包含数字
invalid literal for int() with base 10: 'xyz'

Lever des exceptions

Nous pouvons utiliser l'instruction raise pour lever une exception nous-mêmes

La syntaxe de raise est la suivante :

raise [Exception [, args [, traceback]]]

Dans l'instruction, Exception est le type de l'exception (par exemple, NameError), l'une des exceptions standard ; args est l'argument d'exception que vous fournissez vous-même.

Le dernier paramètre est facultatif (rarement utilisé en pratique) ; s'il est présent, il s'agit de l'objet traceback.

Exemple

Une exception peut être une chaîne, une classe ou un objet. La plupart des exceptions fournies par le noyau Python sont des classes instanciées, qui sont des paramètres d'une instance de classe.

Définir une exception est très simple, comme indiqué ci-dessous :

Exemple

def functionName( level ):
    if level < 1:
        raise Exception("Niveau invalide !", level)
        # Une fois l'exception levée, le code suivant ne sera pas exécuté

Remarque :Pour intercepter une exception, l'instruction "except" doit utiliser le même objet de classe d'exception ou la même chaîne que celle qui a été levée.

Par exemple, pour intercepter l'exception ci-dessus, l'instruction "except" est la suivante :

try:
    正常逻辑
except Exception,err:
    触发自定义异常    
else:
    其余代码

Exemple

Exemple

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# Définir une fonction
def mye( level ):
    if level < 1:
        raise Exception,"Niveau invalide !"
        # Une fois l'exception levée, le code suivant ne sera pas exécuté
try:
    mye(0)            # Lever l'exception
except Exception,err:
    print 1,err
else:
    print 2

En exécutant le code ci-dessus, la sortie est :

$ python test.py 
1 Invalid level!

Exceptions définies par l'utilisateur

En créant une nouvelle classe d'exception, les programmes peuvent nommer leurs propres exceptions. Les exceptions doivent généralement hériter de la classe Exception, directement ou indirectement.

Voici un exemple lié à RuntimeError. Dans l'exemple, une classe est créée avec la classe de base RuntimeError, utilisée pour afficher plus d'informations lorsque l'exception est déclenchée.

Dans le bloc try, le bloc except s'exécute après le déclenchement de l'exception définie par l'utilisateur. La variable e est utilisée pour créer une instance de la classe Networkerror.

class Networkerror(RuntimeError):
    def __init__(self, arg):
        self.args = arg

Après avoir défini la classe ci-dessus, vous pouvez lever l'exception comme suit :

try:
    raise Networkerror("Bad hostname")
except Networkerror,e:
    print e.args
Autres extensions