[解決済み] メソッドを呼び出すとどのような例外が投げられるかを知るにはどうすればよいですか?
質問
Pythonのコードを実行するときに、どのような例外が発生するかを(コーディング時に)知る方法はありますか?
私はどの例外型が投げられるか分からないので、90%の時間は基本Exceptionクラスをキャッチすることになります(何度も例外が深いところから伝播されることがあるので、ドキュメントを読むことは常に役に立ちません。そして、多くの場合、ドキュメントは更新されていないか、正しいものではありません)。
これをチェックするための何らかのツールはありますか(Pythonコードとライブラリを読むことによってなど)?
どのように解決するのですか?
静的な型付けルールがないため、解決策は不正確なものしかないでしょう。
例外をチェックするようなツールは知りませんが、ニーズに合わせて自分でツールを作ってみてはいかがでしょうか(静的解析で少し遊ぶには良い機会です)。
最初の試みとして、ASTを構築する関数を書いて、すべての
Raise
ノードを見つけ、例外を発生させる一般的なパターン (例: コンストラクタを直接呼び出す) を見つけ出そうとする関数を書くことができます。
では
x
は次のプログラムであるとする。
x = '''\
if f(x):
raise IOError(errno.ENOENT, 'not found')
else:
e = g(x)
raise e
'''
ASTを構築するには
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
を意味するはずですが、これは迅速な実用的な結果を得るためにはかなりOKです :)
関連
-
[解決済み] Pythonの辞書からキーを削除するにはどうしたらいいですか?
-
[解決済み] リストからランダムに項目を選択するにはどうすればよいですか?
-
[解決済み] ローカルディレクトリからrequirements.txtファイルに従ってpipを使用してパッケージをインストールするにはどうすればよいですか?
-
[解決済み] すべての例外をキャッチする `try`/`except` ブロックはどのように書けばよいですか?
-
[解決済み] Javaにおける例外処理によるパフォーマンスへの影響とは?
-
[解決済み] dict.copy()を理解する - 浅いか深いか?
-
[解決済み】Exceptionを投げるとき、どの部分が高価なのですか?
-
[解決済み】Pythonでtry-except-elseを使用するのは良い習慣ですか?
-
[解決済み] 範囲指定された浮動小数点数のランダムな配列を生成します。
-
[解決済み] CSVデータを処理する際、1行目のデータを無視する方法を教えてください。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Jupyterノートブックでenv変数を設定する方法
-
[解決済み] Pythonのキャッシュライブラリはありますか?
-
[解決済み] 異なる順序で同じ要素を持つ2つのJSONオブジェクトを等しく比較するには?
-
[解決済み] CSVデータを処理する際、1行目のデータを無視する方法を教えてください。
-
[解決済み] matplotlib でプロットの軸、目盛、ラベルの色を変更する方法
-
[解決済み] Pandasを使って、既存のExcelファイルに新しいシートを保存する方法は?
-
[解決済み] Flaskで非同期タスクを作る
-
[解決済み] PySparkでデータフレームのカラムをString型からDouble型に変更する方法は?
-
[解決済み] Django filter queryset __in for *every* item in list
-
[解決済み] 新しいpip backtrackingの実行時問題の解決