S'il y a une erreur dans le code et qu'une erreur se produit lorsque vous [compilez] le programme (http://e-words.jp/w/E382B3E383B3E38391E382A4E383AB.html), cela s'appelle une "erreur de compilation". Même si la compilation se termine normalement, si quelque chose ne va pas pendant l'exécution, on l'appelle une exception. Dans mon article, j'utilisais le mot «erreur» pour exprimer «exception» afin que le sens puisse être transmis. Dorénavant, nous utiliserons le mot correct «exception».
Les exceptions introduites dans les articles précédents étaient les suivantes.
Une autre exception bien connue est le code qui divise un nombre par 0 et le divise par zéro.
division_by_zero.py
a = 10 / 0
print("{0}".format(a))
Le programme ci-dessus ne génère pas d'erreur au moment de la compilation, mais déclenche une exception au moment de l'exécution comme indiqué ci-dessous.
ZeroDivisionError: integer division or modulo by zero
L'écriture «si une exception se produit» dans le code où une exception peut se produire est appelée gestion des exceptions.
Je ne veux pas que le programme se ferme soudainement pendant son exécution. Par conséquent, modifiez le programme de division zéro écrit ci-dessus afin qu'une exception ne se produise pas au moment de l'exécution.
division_by_zero2.py
try:
a = 10 / 0
print("{0}".format(a))
except ZeroDivisionError:
print("ZeroDivisionError!!")
Insérez le code qui peut provoquer une exception dans ** try: **. Ensuite, entourez le traitement lorsqu'une exception se produit avec ** sauf * type d'exception *: **. Le "type d'exception" doit être approprié. Par exemple, dans le programme ci-dessus, au lieu de ZeroDivisionError (= exception de division zéro) Si vous spécifiez ValueError (= une exception qui stocke une valeur qui ne correspond pas au type de la variable) comme indiqué ci-dessous, l'exception ne sera pas interceptée.
division_by_zero_EXCEPTION2.py
try:
a = 10 / 0
print("{0}".format(a))
except ValueError:
print("ZeroDivisionError!!")
J'obtiens une exception lorsque j'exécute le programme ci-dessus.
Dans le programme précédent, lorsqu'une exception s'est produite, j'ai créé un message à afficher par moi-même, Ceci est disponible car Python conserve les informations lorsqu'une exception se produit. Essayez d'exécuter le programme suivant.
py3.division_by_zero_info.py
try:
a = 10 / 0
print("{0}".format(a))
except ZeroDivisionError as e:
print("type:{0}".format(type(e)))
print("args:{0}".format(e.args))
print("message:{0}".format(e.message))
print("{0}".format(e))
Vous pouvez définir une variable avec des informations d'erreur en écrivant ** exception * type d'exception * comme * variable *: **. Le résultat de sortie est le suivant. Vous souhaiterez peut-être les afficher au lieu de vos propres messages.
type:<type 'exceptions.ZeroDivisionError'> args:('integer division or modulo by zero',) message:integer division or modulo by zero integer division or modulo by zero
Comme je l'ai mentionné plus tôt, le «type d'exception» doit être décrit de manière appropriée, mais il existe plusieurs modèles d'exceptions. Si cela se produit, vous pouvez en écrire plusieurs comme la branche elif.
try:
f = open(file_name,'w')
data = dict_input['data']
f.write(data)
f.close()
except KeyError:
print('Clé introuvable')
except (FileNotFoundError, TypeError) :
print('Le fichier n'a pas pu être ouvert')
except:
print('Une sorte d'erreur s'est produite')
Cela fait partie du traitement du programme qui ouvre le fichier, mais l'entrée et la sortie du fichier sont Comme il n'est pas expliqué dans le "Cours de base Python", l'explication détaillée du code est omise. Regardez les ** sauf KeyError **, ** sauf (FileNotFoundError, TypeError) **, ** except ** parts. Si une exception se produit dans la clause try, Python vérifie d'abord si l'exception peut être interceptée avec une KeyError. Si possible, indiquez «Clé introuvable». S'il ne peut pas être intercepté par KeyError, vérifiez s'il peut être intercepté par FileNotFoundError ou TypeError. Supplément Si possible, affichez "Le fichier n'a pas pu être ouvert". De cette manière, il est possible d'effectuer le même traitement pour plusieurs exceptions. S'il ne parvient toujours pas à attraper, le dernier sauf signifie «toutes les exceptions». Il a la même signification que l'autre d'une branche. Lorsqu'il atteint ce point, il affiche "Une erreur s'est produite".
Si vous préparez seulement sauf: sans écrire plusieurs exceptions, toutes les exceptions seront interceptées, mais Si vous interceptez toutes les exceptions avec la même clause except, il sera difficile de comprendre la cause de l'exception. C'est une bonne idée d'écrire chaque type d'exception, puis d'écrire sauf: à la fin.
else/finally else exécute le processus "lorsque le processus avance jusqu'à la fin sans exception dans la clause try". exécute enfin le processus "enfin, indépendamment de l'occurrence d'une exception".
try_else_finally.py
try:
a = 10 / 0
# a = 10 / 1
print("{0}".format(a))
except ZeroDivisionError as e:
print("ZeroDivisionError!!")
else:
print("else statement")
finally:
print("finally statement")
Exécutez le programme ci-dessus. Puis commentez a = 10/0 et décommentez a = 10/1 ci-dessous. Essayez à nouveau et assurez-vous que les deux sorties sont comme décrit.
raise Vous pouvez utiliser lever pour déclencher délibérément une exception. ** lever ** * Décrivez l'exception que vous souhaitez lever (exception que vous souhaitez envoyer) * à l'endroit où vous souhaitez lever l'exception. Renvoie une exception en écrivant lever dans la clause except. Après avoir exécuté le programme suivant, commentez lever dans la clause except et vérifiez la différence de fonctionnement entre les deux.
raise.py
try:
raise NameError('HiThere')
except NameError:
print('An exception flew by!')
raise
Cela conclut l'explication de l'exception.
Suivant: Cours de base Python (12 fonctions)
Recommended Posts