2016-06-29 9 views
3

標準のライブラリから関数を使用するときには、中規模の商用Pythonプロジェクトに取り組んでいます。関数が呼び出すことができるすべての例外を見つける

標準ライブラリのドキュメントには、関数が投げることができるすべての(または任意の)例外が一覧表示されないことがよくあるので、私たちが思い付くすべてのエラーケースを試してみましょう。それから妥当なものを捕まえる。しかし、非常に頻繁に発生する可能性のあるランダムなエラーは1つも見逃していますが、私たちはそれを思い付きませんでした。たとえば、組み込み定数のいずれかが間違った形になっている場合(trueではなくTrueなど)、json.loads()はValueErrorを発生させることができませんでした。

コードの一部が、それは例外でブレークすることはありませんことを、とても重要であるのではなく、もう一度試してみてくださいので、他のケースでは、我々は、単に例外をキャッチしようとしました。ここの問題は、それがKeyboardInterruptを捕まえることさえあるということです。

ので、ドキュメントはそのことについて何も言わない場合であっても、機能は上げることができ、すべての例外を見つける方法はありますか? 発生可能な例外を判断できるツールはありますか?

+0

あなたがキーボード割り込みをキャッチしたくない場合は、 'StandardError'をキャッチすることができますが、それは静的関数は、実行時に上げるかもしれないもののエラーを伝えることができます私の知る限り何のツールはありません。 – jonrsharpe

+0

FWIW、 'KeyboardInterrupt'は' Exception'から継承しないので 'except Exception'は' KeyboardInterrupts'をキャッチすべきではありません... – mgilson

答えて

0

その機能で撮影することができます可能なコードパスのすべてを読み、そこに上昇させることができるものを例外見るために見ているよりも、この他を行うには現実的な方法はありません。私はある種の自動化ツールがこれを行うために書かれていると思われますが、Pythonの動的性質のために、どこからでも例外が発生する可能性があるので、それはかなり難しいです(もし私が本当にしたいのなら、完全に何かを上げる別の機能を持つ)。

モンキーパッチ適用はさておき、実際に右のそれを取得するには、(多分astroidを助けることができる?)本当に良いタイプinferencerを必要と思い、様々な推測することで機能を、存在しないメンバーにアクセスするか、呼び出しから調達することができTypeErrorAttributeError間違った引数などValueErrorは、あなたが正しいタイプのものを渡すときに引き起されることがあるので、特にトリッキーです。他の例で

コードの一部が、それは例外でブレークすることはありませんことを、とても重要であるのではなく、もう一度試してみてくださいので、私たちは、単に例外をキャッチしようとしました。ここの問題は、それがKeyboardInterruptを捕まえることさえあるということです。

これは私には悪い考えのように感じています。再試行コードは、再試行した場合に異なる結果をもたらす可能性のある例外(奇妙な接続の問題など)に対してのみ実行する必要があります。 ValueErrorの場合は、もう一度ValueErrorを呼び出すだけです。ここでは最良のシナリオはValueErrorが2回目の呼び出しで例外ハンドラの外に伝播する許可されていることである - 最悪のケースは、あなたが本当にに多くの情報を得ることはありません無限ループ(またはRecursionError)で終わるということですデバッグに役立ちます。 Exceptionは最後の手段でなければなりません(とものExceptionから継承されませんので、それはKeyboardInterruptSystemExitをキャッチするべきではありません)、おそらく唯一の誰かが問題を追跡するために使用することができ、エラーメッセージのいくつかの並べ替えをフォーマットする必要がありますキャッチ

と修理する。

+0

答えをありがとう!私が意味するコードの部分は、REST APIを介してハートビート信号を送信して、状態がまだ正しいことを知らせるために使用されました。これらのシグナルのいくつかを失うことは完全にうまくいく。なぜなら、10個のシグナルが消失した後で反対側のサイトが反応するからである。しかし、Handlerが完全にクラッシュした場合、私たちはいくつかのあいまいな例外(この場合はタイムアウト例外)をキャッチするのを忘れていたので、ひどいでしょう。一般的に私は 'catch Exception'を本当に嫌いですが、例外をキャッチするのを忘れてしまったので、私は無作為に失敗する可能性のあるコードを本番環境に置くことはできません。 – Dakkaron

+0

同時に、これは実際のエラーのデバッグを本当に困難にします。 PythonはJavaのような例外をチェックしていました。 – Dakkaron

関連する問題