Il est un exemple précis de quand vous devez utiliser del
(il peut y en avoir d'autres, mais je sais à propos de celui-ci de la main) lorsque vous utilisez sys.exc_info()
d'inspecter une exception. Cette fonction renvoie un tuple, le type d'exception a été soulevée, le message, et un traceback.
Les deux premières valeurs sont généralement suffisants pour diagnostiquer une erreur et d'agir sur elle, mais la troisième contient l'intégralité de la pile d'appel entre, d'où l'exception a été soulevée et l'endroit où l'exception est interceptée. En particulier, si vous faites quelque chose comme
try:
do_evil()
except:
exc_type, exc_value, tb = sys.exc_info()
if something(exc_value):
raise
le traceback, tb
se retrouve dans les locaux de la pile d'appel, la création d'une référence circulaire qui ne peut pas être nettoyée. Ainsi, il est important de faire:
try:
do_evil()
except:
exc_type, exc_value, tb = sys.exc_info()
del tb
if something(exc_value):
raise
à casser la circulaire de référence. Dans de nombreux cas où vous souhaitez appeler sys.exc_info()
, comme avec de la métaclasse de la magie, le traceback est utile, si vous avez à faire assurez-vous que vous le nettoyer avant de vous pouvez éventuellement quitter le gestionnaire d'exception. Si vous n'avez pas besoin de le traceback, vous devez le supprimer immédiatement, ou tout simplement faire:
exc_type, exc_value = sys.exc_info()[:2]
Pour éviter tout ensemble.