Aujourd'hui, je vais vous expliquer ** erreur **. C'est un contenu rudimentaire, mais il est normal d'écrire une erreur `` essayez ~ sauf '', non? Si tel est le cas, veuillez vous y référer. De plus, s'il y a une erreur dans l'explication, je vous serais reconnaissant de bien vouloir commenter.
À propos, les erreurs qui se produisent en Python sont grossièrement divisées en deux types. erreur de syntaxe </ font> et exception </ font>.
Cela se produit lorsque vous pouvez déterminer que vous avez tort avant d'exécuter le programme. Par exemple, une erreur qui se produit lorsque vous utilisez un nom de variable qui ne répond pas aux règles d'identificateur, l'indentation est incorrecte ou la syntaxe est incorrecte de toute façon. Écrivez ʻa [0] comme ʻa [0}
, écrivez ʻif comme ʻof
... (Avez-vous fait cela? J'ai ...) Je ne peux pas vous donner d'exemple. Hmm. En termes simples, les erreurs de syntaxe sont des erreurs grammaticales qui diminuent lorsque vous vous entraînez à écrire des programmes. J'écrirai un exemple pour le moment lol
#Exemples d'erreurs de syntaxe
a = [1, 2, 3]
print(a[3})
production
print(a[3})
^
SyntaxError: invalid syntax
Il s'agit d'une erreur qui se produit lorsque l'ordinateur (interprète?) Détermine «Ne peut pas gérer cela?» Lors de l'exécution du programme. Dans un exemple simple
a = [1, 2, 3]
print(a[3])
production
1 a = [1, 2, 3]
----> 2 print(a[3])
IndexError: list index out of range
Puisque les éléments du tableau n'existent que jusqu'au numéro d'index 2, une exception se produira naturellement lors de la tentative de sortie de ʻa [3] . J'ai montré ʻIndexError
comme exemple d'exception ici, mais il y en a beaucoup plus.
Désormais, lorsque vous exécutez un programme, vous souhaiterez peut-être continuer le traitement même si une exception se produit. Dans ce cas, utilisez le familier try ~ except
. Empêchons le programme de s'arrêter même si ZeroDivisionError
apparaît en raison de la gestion des exceptions.
a = 1
b = 0
try:
print(a/b)
except ZeroDivisionError:
print('Vous ne pouvez pas le diviser par 0, non? J'ai une erreur ZeroDivisionError')
finally:
print('La division est difficile')
production
Vous ne pouvez pas le diviser par 0, non? J'ai une erreur ZeroDivisionError
La division est difficile
Vous pouvez ajouter finally
après le dernier nettoyage, comme dans l'exemple ci-dessus. Ceci est exécuté en dernier, qu'une exception se produise ou non, où le traitement est interrompu et terminé.
ʻExcept` peut être spécifié pour que le taple puisse attraper plusieurs exceptions comme suit:
try:
a = int(input('a = '))
b = int(input('b = '))
print(a/b)
except (ValueError, ZeroDivisionError):
print('J'obtiens une erreur de valeur ou une erreur de division zéro')
Sortie 1
a = 1.5
J'obtiens une erreur de valeur ou une erreur de division zéro
Sortie 2
a = 1
b = 0
J'obtiens une erreur de valeur ou une erreur de division zéro
En outre, vous pouvez nommer l'exception qui se produit. Dans ce qui suit, je tape pour lever une ValueError
ou ZeroDivisionError
, mais j'attrape l'exception qui s'est produite et la nomme ʻER`.
try:
a = int(input('a = '))
b = int(input('b = '))
print(a/b)
except (ValueError, ZeroDivisionError) as ER:
print(f'{type(ER)}Est passe')
Sortie 1
a = 1.5
<class 'ValueError'>Est passe
Sortie 2
a = 1
b = 0
<class 'ZeroDivisionError'>Est passe
Veuillez noter que le nom ʻER ne peut être utilisé que dans la suite de ʻexcept
. Si vous faites ce qui suit, NameError
se produira (car c'est un gros problème, attrapons également cette NameError
).
try:
a = int(input('a = '))
b = int(input('b = '))
print(a/b)
except (ValueError, ZeroDivisionError) as ER:
pass
try:
print(ER)
except NameError:
print('Qu'est-ce que ER?')
production
a = 1.5
Qu'est-ce que ER?
Vous pouvez également déclencher intentionnellement une exception avec rise
. Cependant, vous ne pouvez utiliser ici que des sous-classes ou des instances de la `` classe BaseException ''. (Comme nous le verrons plus tard, la plupart des exceptions courantes sont des sous-classes de cette BaseException
.)
def ErFunc(b: int) -> None:
if b == 0:
raise ZeroDivisionError
b = 0
try:
ErFunc(b)
except BaseException as ER:
print(f'{type(ER)}Se produit')
production
<class 'ZeroDivisionError'>Se produit
Puisque la classe BaseException
est spécifiée ici, toute classe dérivée peut être interceptée. Ici, le ZeroDivisionError
est intercepté.
Enfin, vous pouvez également utiliser des classes pour créer des classes d'exceptions définies par l'utilisateur. Ce qui suit est un programme qui trouve la somme de deux nombres naturels à un seul chiffre, mais lève une exception lorsqu'un nombre négatif ou un nombre à deux chiffres est entré ou lorsque la somme devient deux chiffres. La classe ParameterRangeException
et la classe ReturnRangeException
sont des classes liées à la plage, elles héritent donc de la classe RangeException
. Bien sûr, il n'y a aucun problème si vous héritez de la classe standard intégrée ʻException`.
class RangeException(Exception):
pass
class ParameterRangeException(RangeException):
pass
class ReturnRangeException(RangeException):
pass
def add(a: int, b: int) -> int:
if not 0 < a < 10:
raise ParameterRangeException
if not 0 < b < 10:
raise ParameterRangeException
if a + b > 10:
raise ReturnRangeException
else:
return a + b
try:
a = int(input())
b = int(input())
print(f'La somme des deux nombres{add(a, b)}Deshi')
except ParameterRangeException as PRE:
print(f'{type(PRE)}Se produit. L'argument formel est 1~Ça doit être 9')
except ReturnRangeException as RRE:
print(f'{type(RRE)}Se produit. Je dois rendre la valeur de retour 9 ou moins')
finally:
print('C'est tout pour l'exception')
Sortie 1
1
8
La somme des deux nombres est 9
C'est tout pour l'exception
Sortie 2
2
11
<class '__main__.ParameterRangeException'>Se produit. L'argument formel est 1~Ça doit être 9
C'est tout pour l'exception
Sortie 3
5
7
<class '__main__.ReturnRangeException'>Se produit. Je dois rendre la valeur de retour 9 ou moins
C'est tout pour l'exception
BaseException
. Avec ceci comme parent, il y a une classe ʻException, et la classe
ValueError et la classe ʻIndexError
existent sous une forme qui en hérite.--Lors de la création d'une exception définie par l'utilisateur, ne mettez pas BaseException
dans l'argument de ʻUserExceptionClass (). De par sa conception, la classe
BaseException` ne semble pas supposer qu'elle est héritée par des exceptions définies par l'utilisateur.
--Il existe une classe ʻArithmeticError comme classe enfant de la classe
BaseException, mais il y a la classe ʻOverflowError
et la classe ZeroDivisionError
sous cette classe. Si vous voulez gérer les erreurs arithmétiques, vous pouvez mettre ʻArithmeticError dans l'argument lors de la création d'une exception définie par l'utilisateur (toute classe sous la classe ʻException
est OK).
Recommended Posts