我想解决方案可能只是不精确,因为缺乏静态类型规则。
我不知道有什么工具可以检查异常,但是您可以根据自己的需要来设计自己的工具(这是一个很好的机会来进行一些静态分析)。
作为第一次尝试,您可以编写一个函数来构建AST,查找所有的Raise节点,然后尝试找出引发异常的常见模式(例如,直接调用构造函数)
设x为以下程序:x = '''\
if f(x):
raise IOError(errno.ENOENT, 'not found')
else:
e = g(x)
raise e
'''
使用compiler包构建AST:tree = compiler.parse(x)
然后定义一个Raise访问者类:class RaiseVisitor(object):
def __init__(self):
self.nodes = []
def visitRaise(self, n):
self.nodes.append(n)
并遍历AST收集Raise节点: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),
]
您可以继续使用编译器符号表解析符号,分析数据依赖关系等,或者您可以推断,CallFunc(Name('IOError'), ...)“绝对意味着提高IOError”,这对于快速的实际结果来说是很好的:)