Python ですべての例外をキャッチするのが悪い考えなのはなぜですか?
except:
句を使用してすべての例外をキャッチすると、「特別な」python 例外もキャッチされることを理解しています: SystemExit
、KeyboardInterrupt
、およびGeneratorExit
. except Exception:
では、節を使用してすべての例外をキャッチしないのはなぜでしょうか?
Python ですべての例外をキャッチするのが悪い考えなのはなぜですか?
except:
句を使用してすべての例外をキャッチすると、「特別な」python 例外もキャッチされることを理解しています: SystemExit
、KeyboardInterrupt
、およびGeneratorExit
. except Exception:
では、節を使用してすべての例外をキャッチしないのはなぜでしょうか?
それはひどく非特異的であり、例外を除いて何か面白いことをすることを可能にしないからです. さらに、すべての例外をキャッチしている場合、発生していることに気付いていない大量の例外が発生する可能性があります (理由を知らずにアプリケーションが失敗する可能性があります)。具体的にどの例外を処理する必要があるか、どのように処理する必要があるかを (ドキュメントを読むか実験することで) 予測できるはずですが、最初から盲目的にそれらすべてを抑制している場合は、決してわかりません。
というわけで、リクエストが多かったので、ここに例を示します。プログラマーが Python コードを書いていて、IOError
. さらに調査する代わりに、彼女はすべての例外をキャッチすることにしました。
def foo():
try:
f = open("file.txt")
lines = f.readlines()
return lines[0]
except:
return None
彼女は彼のやり方で問題に気づいていません: ファイルが存在し、アクセス可能であるが、それが空である場合はどうなるでしょうか? 次に、このコードはIndexError
(リストlines
が空であるため) を発生させます。そのため、彼女は、ファイルが存在し、ロックされていないのに、なぜNone
この関数から戻ってきたのかと何時間も考えてしまいますが、彼女がエラーを特定する際にもっと具体的にしていたら明らかだったであろう何か、つまり、存在しないかもしれないデータにアクセスしているということに気付かずにいます。 .
おそらく、各例外を異なる方法で処理したいからです。KeyInterrupt を持つことは、エンコーディングの問題や OS の問題と同じではありません...特定の例外を次々にキャッチできます。
try:
XXX
except TYPE:
YYY
except TYPE:
ZZZ