2009-04-16 8 views

答えて

25

通常、ルートExceptionオブジェクトをキャッチせず、より具体的なものをキャッチすることをお勧めします。たとえばIOExceptionです。

メモリ不足の例外が発生した場合は、単に「パス」を使用してもプログラムを正常な状態にしないでください。

例外は、プログラムのトップレベルにあります。プログラムのトップレベルにあります。ログに記録したり、エラーを表示したり、正常に終了したりすることができます。

+2

この悪い習慣はかなりのデバッグ悪夢を生成します。特にあなたが考えているもの以外の例外があなたのtry/exceptの中で呼び出されたとき。そして、これは単に起こる... – vaab

3

あなたがあまりにも多くをキャッチしていると思います。それは正しい。

1

例外が発生すると例外が発生します。プログラムが終了するのは一般的には良いことです。

いくつかの例外を無視したいかもしれませんが、IMOのような基本クラスをキャッチする正当な理由はありません。

+4

ねえ。私は「正当な理由はない」と私は同意しないと思う - 例えば、特にトリッキーなデータセットで特定の操作を試みるときに例外を発生させるGUIプログラムが想像できる。予期せぬ例外がスタックトレース(早期失敗)でプログラムを終了させるべきだと言うプログラマーとしてはうってつけですが、実際には現在の操作がうまくいかない、メッセージボックスやログファイルメッセージ、そして次にGUIが動作し続けるようにして、例えば何か他に悪いことが起こる前にデータを保存してください。 –

+1

私は完全に同意します、私はOPが 'pass 'で例外を無視する方法を参照していました。私は私の言葉をより明確にすべきだった。 –

+0

あなたの恩赦を、十分に公正してください。 –

-1

Catching Exception(再発生なし)には2つの悪影響があります:エラーが発生してスタックトレースが失われるだけでなく、ctrl-c(またはブレークキーがオペレーティングシステム上にあるもの)ここで扱った

このようなプログラムの典型的な動作は、停止できないか、ctrl-cによって制御フローが(例外ハンドラに)スキップして続行することです。それから、コードを中断することはできません。あるいは、ctrl-cを止めて停止させる必要があります。

+2

これはもはやPython 2.6では真ではなく、KeyboardInterruptはExceptionから継承しなくなりました。 –

+0

スタックトレースが失われることはありません。 sys.exc_info()で 'traceback'モジュールを使用するだけです。 – PeqNP

15

非常に狭い範囲の種類のみをキャッチすることをお勧めします。 「例外」はあまりにも一般的です。あなたが計画したエラーだけでなく、他のエラーも捕らえてしまいます。コード内のバグをマスクして、まったくキャッチされなかった場合の診断が速くなります。単一の非常に高いレベルの例外ハンドラでよりうまく対処してください。

Python2.6以降、Exceptionをキャッチしたくない例外(SystemExit、KeyboardInterrupt)がExceptionを継承しなくなったため、Exceptionをキャッチするのがより合理的になっています。代わりに、代わりに共通のBaseExceptionを継承します。これは、そのような共通のイディオムであるため、例外をキャッチすることを比較的無害にするために意図的に行われています。

詳細についてはPEP 3110を参照してください。&今後の計画

0

グレッグの答えのように、 '例外'は基本クラスであり、例外はこのクラスから派生する必要があります。exceptions.Exceptionも参照してください。ここで

pydocs

注例外が発生した場所を見つけることができます非常に便利なトレースバックモジュールのエラーの非常に便利なリスト。 「except:...」だけを使用すると、あなたのケースで最もよく使うべきエラーが表示されます。たとえば、このコードを試して(コメントを切り替えて)、おそらくそれを受け入れるでしょう:

関連する問題