Supposons donc que j'ai du code qui soulève n'importe quel type ou erreur. Je veux plutôt que mon code déclenche une AssertionError, mais j'imprime le message d'origine qui aurait été imprimé avec l'erreur d'origine. Comment pourrais-je faire ça?
(exemple)
erreur d'origine: TypeError: '>' non pris en charge entre les instances de 'str' et 'int'
erreur personnalisée: AssertionError: exception = TypeError: '>' non prise en charge entre les instances de 'str' et 'int'
3 Réponses :
Vous devrez attraper l'exception levée, puis lever le type de votre choix. Puisque vous avez mentionné vouloir attraper tout type d'erreur, vous devrez utiliser la classe Exception comme votre capture.
Cependant, je tiens à noter que c'est généralement une mauvaise pratique car vous ne voulez généralement détecter que les erreurs spécifiques que vous prévoyez avoir. Mais si vous finissez par lancer une erreur de toute façon, je suppose que ce n'est pas terrible. Mais je me demande aussi précisément quel est l'objectif de ce code. Quoi qu'il en soit ..
attraper n'importe quoi
essayer ... sauf Exception comme e
lever l'erreur préférée
augmenter AssertionError ()
obtenir le message
e.message
obtenir le type
type (e)
<type 'exceptions.TypeError'>: unsupported operand type(s) for +: 'int' and 'str'
Le résultat serait:
try:
# some code that raises an error
g = 10 + '11'
except Exception as e:
raise AssertionError('{}: {}'.format(type(e), e.message))
Ceci pourrait être nettoyé pour se débarrasser de la sortie laide du type (e) mais en général, c'est ainsi que vous incluriez le type d'erreur ainsi que son message correspondant.
p>
Merci, votre réponse m'a aidé, mais j'aimerais aussi savoir quel était le type d'erreur d'origine. Ici, l'original était un TypeError, alors comment le saurais-je?
oh oui, vous pouvez utiliser le type (e) pour y accéder. Je modifierai la réponse pour l'inclure.
également @J_H a une solution beaucoup plus propre. Je pense que cette fonctionnalité est spécifique à Python 3, mais c'est la version que vous avez étiquetée, donc j'irais avec ça
Vous pouvez également masquer le suivi d'origine en définissant __suppress_context__ = True et effectuer un formatage pour répondre à vos besoins de sortie attendue:
Traceback (most recent call last):
File "./file.py", line 8, in <module>
raise assertion_exc
AssertionError: exception = TypeError: '>' not supported between instances of 'str' and 'int'
Sortie complète: p >
try:
a = '1' > 1
except Exception as exc:
assertion_exc = AssertionError('exception = {}: {}'.format(type(exc).__name__, str(exc)))
assertion_exc.__suppress_context__ = True # comment this line to see full traceback
raise assertion_exc
J'aimerais que mon exception soit plus générale. Dans mon exemple, TypeError n'était qu'un exemple de l'un des types d'erreurs possibles. Alors, comment pourrais-je englober n'importe quel type d'erreur?
sauf exception attrapera n'importe quoi. Mis à jour ma réponse.
Vous recherchez la Vous pouvez fournir une chaîne contenant un message de diagnostic lorsque vous créez une nouvelle exception.
Il serait préférable de définir vos propres exceptions spécifiques à l'application, plutôt que de recycler AssertionError.
Si vous en définissez plusieurs, faites de l'un d'eux le [grand] parent et faites hériter d'autres exceptions de cet ancêtre.
Cela permet aux appelants d’attraper facilement des classes d’erreurs à granularité fine ou grossière. Il existe un PEP qui décrit d'autres considérations. from syntaxe a > (introduit dans Python 3) qui vous permet d'encapsuler une exception spécifique à une application autour d'une exception de base.
Voici un exemple: >>> try:
... 1 > '1'
... except TypeError as e:
... raise AssertionError() from e
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
TypeError: '>' not supported between instances of 'int' and 'str'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
AssertionError