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
Nom de l'exception | Description |
---|---|
BaseException | Classe de base pour toutes les exceptions |
SystemExit | Demande de sortie de l'interprète |
KeyboardInterrupt | L'utilisateur interrompt l'exécution (généralement en tapant ^C) |
Exception | Classe de base pour les erreurs générales |
StopIteration | Iterator n'a plus de valeurs |
GeneratorExit | Generator 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 | |
RuntimeWarning | Avertissement concernant un comportement d'exécution suspect |
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 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