Ne prenez pas une instance d'une classe d'exception Python directement comme argument de la classe d'exception!

Cette fois, je voudrais parler de l'utilisation d'une instance d'une classe d'exception Python directement comme argument de la classe d'exception, mais en premier lieu

Je ne suis pas sûr de la situation "** Créez une instance de la classe d'exception directement en tant qu'argument de la classe d'exception **".

Je suis sûr qu'il y a des gens qui disent cela, alors définissons une situation un peu plus précise.

Tout d'abord, disons que vous avez créé un module de spam en Python, préparé SpamError comme classe de base pour les exceptions de module et créé une classe d'exception personnaliséeSpamIndexError qui a hérité de SpamError et du standard Python ʻIndexError`.

Cela ressemble à ceci lorsque vous l'écrivez réellement.

spam.py


class SpamError(Exception):
    pass


class SpamIndexError(SpamError, IndexError):
    pass

Ensuite, en raison de l'exigence selon laquelle les utilisateurs qui utilisent le module spam peuvent compléter les erreurs standard Python qui se produisent dans le module spam avec ʻexcept spam.SpamError comme exception: `etc., dans le module spam

spam.py


try:
    [][0]  #Une erreur d'index se produit
except IndexError as original:
    raise SpamIndexError(original) from original

J'ai décidé d'écrire un code comme celui-ci. La raison pour laquelle l'argument de SpamError dans la dernière ligne est ʻoriginal, qui est une exception complétée par l'instruction except, est destiné à afficher le message équivalent à ʻIndexError d'origine. C'est une pratique courante dans de nombreuses sources.

Lorsque j'exécute le code ci-dessus,

python


Traceback (most recent call last):
  File "./spam.py", line 16, in <module>
    [][0]  #Une erreur d'index se produit
IndexError: list index out of range

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "./spam.py", line 18, in <module>
    raise SpamIndexError(original) from original
spam.SpamIndexError: list index out of range

Est affiché. Les deux ʻIndexError et SpamIndexErrorsont affichés commeindex de liste hors de portée`. Il n'y a pas de problème pour l'instant.

Mais malheureusement si c'était une KeyError au lieu d'une ʻIndexError`

python


Traceback (most recent call last):
  File "./spam.py", line 16, in <module>
    {}[0] #KeyError se produit
KeyError: 0

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "./spam.py", line 18, in <module>
    raise SpamKeyError(original) from original
spam.SpamKeyError: KeyError(0,)

Sera affiché comme ça. L'original KeyError est affiché comme KeyError: 0, mais le SpamKeyError est affiché commespam.SpamKeyError: KeyError (0,). ʻIndexError évalue l'argument avec str () , mais KeyError évalue avec repr () `quand il y a un argument, c'est donc le cas.

Pour éviter cela

python


    raise SpamKeyError(original) from original

Ligne,

python


    raise SpamKeyError(*original.args) from original

Au lieu de ʻoriginal, prenez l'argument de l'exception d'origine, * original.args`. Puis

python


Traceback (most recent call last):
  File "./spam.py", line 16, in <module>
    {}[0] #KeyError se produit
KeyError: 0

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "./spam.py", line 18, in <module>
    raise SpamKeyError(*original.args) from original
spam.SpamKeyError: 0

S'affiche et «SpamKeyError» s'affiche de la même manière que l'original «KeyError».

Cependant, il est acceptable de prendre * original.args comme argument uniquement si l'exception que vous générez hérite de la classe de l'exception d'origine. Si non,

python


    raise SpamError(str(original)) from original

Il est prudent de placer les exceptions complétées dans str () et d'utiliser de force une chaîne de caractères comme argument.

Si vous voulez lever une classe d'exception qui hérite simplement de la classe ʻException`,

python


    raise SpamError(original) from original

Il est normal de dire que vous n'avez pas à le placer dans str () like, mais dans ce cas, l'exception qui était affichée comme KeyError: 0 est affichée comme spam.SpamError: 0. Par conséquent, il devient difficile de comprendre de quel type d'erreur il s'agit du message.

Dans tous les cas, ce serait une mauvaise idée d'utiliser simplement l'instance de classe d'exception ʻoriginal` comme argument.

Recommended Posts

Ne prenez pas une instance d'une classe d'exception Python directement comme argument de la classe d'exception!
Script pour changer la description de fasta
Script pour tweeter avec des multiples de 3 et des nombres avec 3 !!
Créer une instance de GPU AWS pour entraîner StyleNet
Utilisation pour appeler une méthode d'une instance avant qu'elle ne soit renvoyée par __new__
Ne prenez pas une instance d'une classe d'exception Python directement comme argument de la classe d'exception!
Comment créer une instance d'une classe particulière à partir de dict en utilisant __new__ () en python
Créer une instance d'une classe prédéfinie à partir d'une chaîne en Python
Format lors du passage d'une longue chaîne comme argument de python
Je veux clarifier la question de la méthode "__init__" et de l'argument "self" de la classe Python.
Hit une méthode d'une instance de classe avec l'API Web Python Bottle
Python: préparez un sérialiseur pour l'instance de classe:
[Fabric] J'étais accro à l'utilisation de booléen comme argument, alors notez les contre-mesures.
Implémentation python de la classe de régression linéaire bayésienne
Pourquoi le premier argument de la classe [Python] est-il self?
Remarque: Signification de spécifier uniquement * (astérisque) comme argument dans la définition de fonction de Python
Jetez un œil à l'arborescence des exceptions intégrée à Python
[OCI] Script Python pour obtenir l'adresse IP d'une instance de calcul dans Cloud Shell
Comment déterminer l'existence d'un élément sélénium en Python
[Road to Intermediate Python] Appelez une instance de classe comme une fonction avec __call__
Comment connaître la structure interne d'un objet en Python
Comment vérifier la taille de la mémoire d'une variable en Python
Comment vérifier la taille de la mémoire d'un dictionnaire en Python
[Python3] Définition d'un décorateur qui mesure le temps d'exécution d'une fonction
Jetez un œil à l'arborescence des exceptions intégrée dans Python 3.8.2
[python] Une note que j'ai commencé à comprendre le comportement de matplotlib.pyplot
Je suis mort en pensant qu'une variable de classe Python était une variable d'instance
[Python] Une fonction simple pour trouver les coordonnées du centre d'un cercle
[Python] Un programme qui fait pivoter le contenu de la liste vers la gauche
[Python] Un programme qui calcule le nombre de chaussettes jumelées
Remarque Python: lorsque vous souhaitez connaître les attributs d'un objet
[Introduction à Python] Comment trier efficacement le contenu d'une liste avec le tri par liste
Je veux expliquer en détail la classe abstraite (ABCmeta) de Python
Je veux colorer une partie de la chaîne Excel avec Python
Fonction Eval () qui calcule une chaîne de caractères comme expression en python
Code Python pour déterminer les signaux mensuels pour les investissements de force relative
Obtenez une instance datetime à tout moment de la journée en Python
J'ai fait un programme pour vérifier la taille d'un fichier avec Python
Python: je souhaite mesurer proprement le temps de traitement d'une fonction
Un exemple de réponse à la question de référence de la session d'étude. Avec python.
J'ai créé une fonction pour voir le mouvement d'un tableau à deux dimensions (Python)
[Python] Comment rendre une classe itérable
[python] Obtenir une liste de variables d'instance
[python] [meta] Le type de python est-il un type?
L'histoire du traitement A du blackjack (python)
<Python> Un quiz pour convertir par lots les noms de fichiers séparés par une chaîne de caractères spécifique dans le cadre du nom de fichier
Ne spécifiez pas un objet mutable (type de liste, type de dictionnaire, etc.) comme valeur initiale de l'argument de fonction de python.
[Python] Comment gérer l'erreur d'instance is "is instance () arg 2 doit être un type ou un tuple de types"
Différentes façons de lire la dernière ligne d'un fichier csv en Python
Python> fonction> Exemple de prise de fonction comme argument> map (lambda x: 2 ** x, [1, 2, 3]) / locals () ['myprint'] (3.1415, 2.718)
[Circuit x Python] Comment trouver la fonction de transfert d'un circuit en utilisant Lcapy
Vous pouvez appeler la méthode de la classe directement dans Python3 sans ajouter @staticmethod
[Python] A créé une classe pour jouer des vagues de péché en arrière-plan avec pyaudio
[python] Comment trier par le Nth Mth élément d'un tableau multidimensionnel
J'ai créé une commande appdo pour exécuter des commandes dans le contexte de l'application
Enregistrez le tableau numpy dans un fichier wav à l'aide du module wave
Créez un environnement python pour apprendre la théorie et la mise en œuvre de l'apprentissage profond
Script Python pour obtenir une liste d'exemples d'entrée pour le concours AtCoder