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