静的な型付けルールがないため、解決策は不正確になる可能性があると思います。
例外をチェックするツールを私は知りませんが、ニーズに合った独自のツールを思いつくことができます(静的分析で少し遊ぶ良い機会です)。
最初の試みとして、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これは、迅速な実用的な結果にはまったく問題ありません:)
raiseだけでなく文字列も使用できることに注意してくださいBaseException。したがって、制御except Exceptionできないライブラリコードを呼び出す場合でも、文字列の例外をキャッチしないため、十分ではありません。他の人が指摘しているように、あなたはここで間違った木を吠えています。