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'exception | Description |
|---|---|
| BaseException | Classe de base pour toutes les exceptions |
| SystemExit | Sortie demandée par l'interpréteur |
| KeyboardInterrupt | Interruption de l'exécution par l'utilisateur (généralement en entrant ^C) |
| Exception | Classe 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 |
| StandardError | Classe 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 |
| OverflowError | L'opération numérique dépasse la limite maximale |
| ZeroDivisionError | Division (ou modulo) par zéro (tous les types de données) |
| AssertionError | Échec de l'instruction d'assertion |
| AttributeError | L'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 |
| IndexError | Aucun index de ce type dans la séquence |
| KeyError | Aucune clé de ce type dans la table de correspondance |
| MemoryError | Erreur de dépassement de mémoire (non fatale pour l'interpréteur Python) |
| NameError | Objet non déclaré/non initialisé (aucun attribut) |
| UnboundLocalError | Accès à une variable locale non initialisée |
| ReferenceError | Une 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 |
| NotImplementedError | Méthode pas encore implémentée |
| SyntaxError | Erreur de syntaxe Python |
| IndentationError | Erreur d'indentation |
| TabError | Mélange de tabulations et d'espaces |
| SystemError | Erreur système générale de l'interpréteur |
| TypeError | Opé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 |
| UnicodeTranslateError | Erreur lors de la conversion Unicode |
| Avertissement | Classe de base pour |
| DeprecationWarning | Avertissement concernant des fonctionnalités obsolètes |
| FutureWarning | Avertissement concernant des constructions dont la sémantique changera à l'avenir |
| OverflowWarning | Ancien avertissement concernant la promotion automatique vers long (long) |
| PendingDeprecationWarning | Avertissement concernant des fonctionnalités qui seront obsolètes |
| RuntimeWarning | Avertissement concernant une exécution suspecte |
| SyntaxWarning | Avertissement concernant une syntaxe suspecte |
| UserWarning | Avertissement 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
# -*- 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
# -*- 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
# -*- 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
# -*- 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
# -*- 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
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
# -*- 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