3
votes

Je veux que mon code génère un type ou une erreur spécifique, mais imprime l'erreur d'origine

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'


0 commentaires

3 Réponses :


3
votes

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)

Assembler tout cela:
<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>


3 commentaires

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



1
votes

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


2 commentaires

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.