2012-05-15 9 views
7

Pythonですべての例外をキャッチするのはなぜ悪い考えですか? SystemExitKeyboardInterrupt、およびGeneratorExitPythonですべての例外をキャッチするという悪い考えがある

私はexcept:句を使用して、すべての例外をキャッチすることも、「特別な」Pythonの例外をキャッチすることを理解しています。だから、なぜすべての例外をキャッチするのにexcept Exception:節を使用しないのですか?

+6

お奨めは、私はそれが生産コードですべてをキャッチするために、より良いだと思うが、ソフトウェアが開発されているとして、それはデバッグのためにあなたのコードを困難にする可能性がある」日にすべての – jamylak

+0

をキャッチ.... –

+4

@jamylakます。http: //stephenvick.wordpress.com/2010/08/02/pokemon-exception-handling/ –

答えて

20

非常に非特異的なので、例外で面白いことをすることはできません。さらに、すべての例外をキャッチしている場合は、起こっていることもわからないような例外が発生する可能性があります(アプリケーションが実際に原因を知ることなく失敗する可能性があります)。あなたは、処理する必要のある例外とその処理方法を具体的に予測することができますが、最初から盲目的にすべてを抑制していると、決して知らないでしょう。

一般的なご要望により、ここに例があります。プログラマーがPythonコードを書いていて、IOErrorを取得します。代わりに、さらなる調査のため、彼女はすべての例外をキャッチすることを決定:

def foo(): 
    try: 
     f = open("file.txt") 
     lines = f.readlines() 
     return lines[0] 
    except: 
     return None 

彼女は彼の方法で問題を認識していません:ファイルが存在し、アクセス可能であるが、それは空で何か?次に、このコードはlinesが空であるためIndexErrorを生成します。だから彼女はなぜファイルが存在するときにNoneをこの機能から戻しているのだろうと疑問に思って時間を過ごすだろうし、もし彼女がエラーを捕まえることでより具体的だったら何かを実現することなくロックしていない。存在する。

+0

@ラファエ:具体的な事例を教えてもらえますか? – Bandicoot

+0

@Bandicootなぜすべての例外をキャッチするのが悪い考えですか? –

+0

@Raffe:はい。あなたの答えをより良く理解するのに役立ちます。ありがとう! – Bandicoot

3

おそらく、各例外を別々に扱いたいと思うかもしれないからです。 Encodingの問題やOSの問題よりも、KeyInterruptを持つのと同じことではありません。特定の例外を次々に捕まえることができます。

try: 
    XXX 
except TYPE: 
    YYY 
except TYPE: 
    ZZZ 
関連する問題