Maison > développement back-end > Tutoriel Python > Quelle est la différence entre raise et raise... en Python ?

Quelle est la différence entre raise et raise... en Python ?

不言
Libérer: 2018-12-13 11:19:33
avant
7297 Les gens l'ont consulté

Ce que cet article vous apporte, c'est la différence entre raise et raise... depuis Python ? Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.

Démarrage

Quelle est la différence entre raise et raise from en Python ?

try:
    print(1 / 0)
except Exception as exc:
    raise RuntimeError("Something bad happened")
Copier après la connexion

Sortie :

Traceback (most recent call last):
  File "test4.py", line 2, in <module>
    print(1 / 0)
ZeropisionError: pision by zero

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "test4.py", line 4, in <module>
    raise RuntimeError("Something bad happened")
RuntimeError: Something bad happened
Copier après la connexion

Et raise from :

try:
    print(1 / 0)
except Exception as exc:
    raise RuntimeError("Something bad happened") from exc
Copier après la connexion

Sortie :

Traceback (most recent call last):
  File "test4.py", line 2, in <module>
    print(1 / 0)
ZeropisionError: pision by zero

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

Traceback (most recent call last):
  File "test4.py", line 4, in <module>
    raise RuntimeError("Something bad happened") from exc
RuntimeError: Something bad happened
Copier après la connexion

Analyse

La différence est que from définira l'attribut __cause__ pour l'objet d'exception pour indiquer qui a directement provoqué l'exception.

Une nouvelle exception s'est produite lors du traitement de l'exception. Lorsque from n'est pas utilisé, il est plus probable que la nouvelle exception ne soit pas liée à l'exception en cours de traitement. Et from peut souligner que la nouvelle exception est directement provoquée par l’ancienne exception. De telles corrélations entre les anomalies sont utiles pour l'analyse ultérieure et le dépannage des anomalies. Il existe une restriction dans la syntaxe from, c'est-à-dire que la deuxième expression doit être une autre classe ou instance d'exception.

Si une exception est déclenchée dans un gestionnaire d'exceptions ou finalement dans un bloc, le mécanisme d'exception fonctionne implicitement par défaut en ajoutant l'exception précédente en tant qu'attribut __context__ de la nouvelle exception.

Bien sûr, vous pouvez également définir l'attribut context __context__ pour les exceptions via la méthode with_traceback(), qui peut également mieux afficher les informations sur les exceptions dans le traçage.

raise Exception("foo occurred").with_traceback(tracebackobj)
Copier après la connexion

Interdire l'association d'exception

from Il existe également un usage spécial : raise ... from None, qui interdit explicitement l'association d'exception en définissant la spécification de l'attribut __suppress_context__ :

try:
    print(1 / 0)
except Exception as exc:
    raise RuntimeError("Something bad happened") from None
Copier après la connexion

Sortie :

Traceback (most recent call last):
  File "test4.py", line 4, in <module>
    raise RuntimeError("Something bad happened") from None
RuntimeError: Something bad happened
Copier après la connexion

Résumé

Lorsqu'une exception est levée dans un gestionnaire d'exceptions ou finalement bloquée, Python définira En définissant le contexte de l'exception, vous pouvez définir manuellement son contexte via with_traceback(), ou utiliser from pour spécifier qui a provoqué l'exception. Ces méthodes visent toutes à obtenir des informations de traçabilité des exceptions plus conviviales et à imprimer un contexte d'exception clair. Pour ignorer le contexte, vous pouvez désactiver l'affichage automatique du contexte d'exception en levant ... depuis None .

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal