Gestion des exceptions Python


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

  • Gestion des exceptions : le didacticiel Python de ce site le présentera en détail.

  • Assertions : le didacticiel Python de ce site les présentera en détail.


Exceptions standard Python

Generator Une exception se produit pour notifier la sortieLa classe de base pour toutes les exceptions standard intégréesClasse de base pour toutes les erreurs de calcul numériqueErreur de calcul en virgule flottanteL'opération numérique dépasse le maximum limitDivision (ou modulo) zéro (tous les types de données) L'instruction d'assertion a échouéL'objet n'a pas cet attributNo build- en entrée, indicateur EOF atteintClasse de base pour les erreurs du système d'exploitation Échec de l’opération d’entrée/sortieErreur du système d’exploitationÉchec de l’appel systèmeÉchec de l'importation du module/objetClasse de base de requête de données non valideL'index est introuvable dans la séquenceIntrouvable dans la carte Ceci keyErreur de débordement de mémoire (non fatal à l'interpréteur Python) Objet non déclaré/initialisé (aucune propriété)Accès à une variable locale non initialisée Une référence faible tente d'accéder à un objet qui a été récupéré.Erreur d'exécution généraleMéthode pas encore implémentéeErreur de syntaxe PythonErreur d'indentation Tabulation et espaces mélangésErreurs générales du système d'interprétationOpération invalide sur le typeParamètre invalideErreurs liées à UnicodeErreur de décodage UnicodeErreur d'encodage UnicodeErreur de conversion UnicodeClasse de base pour warnsAvertissement concernant les fonctionnalités obsolètesAvertissement que la sémantique de la construction va changer à l'avenirAncien avertissement automatique de promotion trop longueAvertissement que la fonctionnalité sera obsolète<🎜><🎜>
Nom de l'exceptionDescription


BaseExceptionClasse de base pour toutes les exceptions
SystemExitDemande de sortie de l'interprète
KeyboardInterruptL'utilisateur interrompt l'exécution (généralement en tapant ^C)
Exception Classe de base pour les erreurs générales
StopIterationIterator n'a plus de valeurs
GeneratorExitGenerator Une exception se produit pour notifier la sortie
StandardError
ArithmeticError
FloatingPointError
OverflowError
ZeroDivisionError
AssertionError
AttributeError
EOFError
EnvironmentError
IOError
OSError
WindowsError
ImportError
LookupError
IndexError
KeyError
MemoryError
NameError
UnboundLocalError
ReferenceError
RuntimeError
NotImplementedError
SyntaxError
IndentationError
TabError
SystemError
TypeError
ValueError
UnicodeError
UnicodeDecodeError
UnicodeEncodeError
UnicodeTranslateError
Avertissement
DeprecationWarning
FutureWarning
OverflowWarning
PendingDeprecationWarning
RuntimeWarningAvertissement concernant un comportement d'exécution suspect
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 affecte l'exécution normale du programme.

Généralement, une exception se produit lorsque Python ne peut pas gérer le programme normalement.

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

Lorsqu'une exception se produit dans un script Python, nous devons l'attraper et la gérer, sinon le programme mettra fin à son exécution.


Gestion des exceptions

Pour détecter les exceptions, les instructions try/sauf peuvent être utilisées.

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

Si vous ne souhaitez pas terminer votre programme lorsqu'une exception se produit, interceptez-la simplement en essayant.

Syntaxe :

Ce qui suit est la syntaxe d'un simple try....sauf...else : Le principe de fonctionnement de

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

try est que lorsqu'une instruction try est démarrée, Python marque le contexte du programme en cours afin qu'il puisse être renvoyé ici lorsqu'une exception se produit. La clause try est exécutée en premier, et ce qui se passe ensuite dépend si une exception se produit pendant l'exécution.

  • Si une exception se produit lorsque l'instruction après try est exécutée, python reviendra en arrière pour essayer et exécuter la première clause except qui correspond à l'exception. Une fois l'exception traitée, le flux de contrôle. passe L'intégralité de l'instruction try (sauf si une nouvelle exception est levée lors de la gestion 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 supérieur, ou au niveau supérieur du programme (ce mettra fin au programme et imprimera le message d'erreur par défaut).

  • Si aucune exception ne se produit lors de l'exécution de la clause try, python exécutera l'instruction après l'instruction else (s'il y en a une autre), puis le flux de contrôle passera par tout le try déclaration.

Exemple

Ce qui suit est un exemple simple, il ouvre un fichier, écrit le contenu dans le fichier et aucune exception ne se produit :

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

try:
    fh = open("testfile", "w")
    fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
    print "Error: 没有找到文件或读取文件失败"
else:
    print "内容写入文件成功"
    fh.close()

Les résultats du programme ci-dessus :

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

Exemple

Ce qui suit est un exemple simple, il ouvre un fichier et écrit le contenu dans le fichier, mais le fichier n'a pas d'autorisation d'écriture, une exception s'est produit :

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

try:
    fh = open("testfile", "w")
    fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
    print "Error: 没有找到文件或读取文件失败"
else:
    print "内容写入文件成功"
    fh.close()

Pour faciliter les tests avant d'exécuter le code, nous pouvons d'abord supprimer l'autorisation d'écriture du fichier testfile. La commande est la suivante :

chmod -w testfile

Exécutez ensuite le code ci-dessus :

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

Utiliser sauf sans type d'exception

Vous pouvez utiliser sauf sans type d'exception, comme indiqué dans l'exemple suivant :

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

Ce qui précède façon dont l'instruction try-sauf capture toutes les exceptions d'occurrences. Mais ce n’est pas une bonne méthode, nous ne pouvons pas identifier des informations anormales spécifiques via ce programme. Parce qu'il détecte toutes les exceptions.


Utiliser except avec plusieurs types d'exception

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écutera le dernier code, qu'une exception se produise ou non.

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

Exemple

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

try:
    fh = open("testfile", "w")
    fh.write("这是一个测试文件,用于测试异常!!")
finally:
    print "Error: 没有找到文件或读取文件失败"

Si le fichier ouvert n'a pas d'autorisations d'écriture, le résultat sera le suivant :

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

Le même exemple peut également être écrit comme suit :

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

try:
    fh = open("testfile", "w")
    try:
        fh.write("这是一个测试文件,用于测试异常!!")
    finally:
        print "关闭文件"
        fh.close()
except IOError:
    print "Error: 没有找到文件或读取文件失败"

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

Une fois que toutes les instructions du bloc final sont exécutées, l'exception est à nouveau déclenchée et le code du bloc except est exécuté.

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


Paramètres d'exception

Une exception peut transporter des paramètres, qui peuvent être utilisés comme paramètres d'informations d'exception de sortie.

Vous pouvez capturer les paramètres d'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 incluse dans l'instruction d'exception. Les variables sous forme de tuples peuvent recevoir une ou plusieurs valeurs.

le tuple contient généralement une mauvaise chaîne, un mauvais numéro, une mauvaise position.

Instance

Ce qui suit est un exemple d'une seule exception :

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

# 定义函数
def temp_convert(var):
    try:
        return int(var)
    except ValueError, Argument:
        print "参数没有包含数字\n", Argument

# 调用函数
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'

Déclencher une exception

Nous pouvons utiliser l'instruction raise pour déclencher nous-mêmes des exceptions

Le format de syntaxe de raise est le suivant :

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

L'exception dans l'instruction est le type d'exception (par exemple, NameError) et le paramètre est une valeur de paramètre d'exception. Ce paramètre est facultatif, s'il n'est pas fourni, le paramètre d'exception est "Aucun".

Le dernier paramètre est facultatif (rarement utilisé en pratique) et, s'il est présent, est l'objet d'exception de trace.

Instance

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 les paramètres d'une instance d'une classe.

Définir une exception est très simple, comme suit :

def functionName( level ):
    if level < 1:
        raise Exception("Invalid level!", level)
        # 触发异常后,后面的代码就不会再执行

Remarque : Pour pouvoir intercepter l'exception, l'instruction "sauf" doit lancer l'objet de classe avec la même exception ou chaîne.

Par exemple, si nous captons l'exception ci-dessus, l'instruction "sauf" est la suivante :

try:
    正常逻辑
except "Invalid level!":
    触发自定义异常    
else:
    其余代码

Instance

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

# 定义函数
def mye( level ):
    if level < 1:
        raise Exception("Invalid level!", level)
        # 触发异常后,后面的代码就不会再执行

try:
    mye(0)                // 触发异常
except "Invalid level!":
    print 1
else:
    print 2

Exécutez le code ci-dessus, le résultat de sortie est :

$ python test.py 
Traceback (most recent call last):
  File "test.py", line 11, in <module>
    mye(0)
  File "test.py", line 7, in mye
    raise Exception("Invalid level!", level)
Exception: ('Invalid level!', 0)

Exceptions définies par l'utilisateur

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

Ce qui suit est un exemple lié à RuntimeError. Une classe est créée dans l'exemple. La classe de base est RuntimeError, qui est utilisée pour générer plus d'informations lorsqu'une exception est déclenchée.

Dans le bloc d'instruction try, l'instruction except block est exécutée après 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 déclencher l'exception comme suit :

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