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

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

不言
不言avant
2018-12-13 11:19:337173parcourir

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")

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

Et raise from :

try:
    print(1 / 0)
except Exception as exc:
    raise RuntimeError("Something bad happened") from exc

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

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)

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

Sortie :

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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer