Je suppose qu'une solution ne pourrait être qu'imprécise en raison de l'absence de règles de typage statique.
Je ne connais pas d'outil qui vérifie les exceptions, mais vous pourriez créer votre propre outil en fonction de vos besoins (une bonne occasion de jouer un peu avec l'analyse statique).
Comme première tentative, vous pourriez écrire une fonction qui construit un AST, trouve tous les éléments de l'AST. Raise
et essaie ensuite de déterminer les modèles courants de levée d'exceptions (par exemple, l'appel direct d'un constructeur).
Soit x
soit le programme suivant :
x = '''\
if f(x):
raise IOError(errno.ENOENT, 'not found')
else:
e = g(x)
raise e
'''
Construire l'AST en utilisant le compiler
paquet :
tree = compiler.parse(x)
Définissez alors une Raise
classe de visiteurs :
class RaiseVisitor(object):
def __init__(self):
self.nodes = []
def visitRaise(self, n):
self.nodes.append(n)
Et marcher sur l'AST en collectant Raise
des nœuds :
v = RaiseVisitor()
compiler.walk(tree, v)
>>> print v.nodes
[
Raise(
CallFunc(
Name('IOError'),
[Getattr(Name('errno'), 'ENOENT'), Const('not found')],
None, None),
None, None),
Raise(Name('e'), None, None),
]
Vous pouvez continuer en résolvant les symboles en utilisant les tables de symboles du compilateur, en analysant les dépendances de données, etc. Ou vous pouvez simplement déduire que CallFunc(Name('IOError'), ...)
"devrait définitivement signifier l'augmentation IOError
", ce qui est tout à fait correct pour des résultats pratiques rapides :)
3 votes
Gardez à l'esprit que dans Python < 2.6, vous pouvez
raise
ainsi que les chaînes de caractères, pas seulementBaseException
sous-classes. Donc si vous faites appel à du code de bibliothèque qui est hors de votre contrôle, mêmeexcept Exception
n'est pas suffisant, puisqu'il ne permet pas d'attraper les exceptions relatives aux chaînes de caractères. Comme d'autres l'ont souligné, vous vous trompez de cible.0 votes
Je ne le savais pas. Je pensais que sauf Exception : attrape presque tout.
3 votes
except Exception
fonctionne bien pour attraper les exceptions de chaîne dans Python 2.6 et plus.