24

このようなブロックの場合:

try:
    #some stuff
except Exception:
    pass

pylint で警告 W0703 'Catch "Exception"' が発生します。なんで?

4

6 に答える 6

35

より具体的なオブジェクト (IOException など) をキャッチする代わりに、通常はルート Exception オブジェクトをキャッチしないことをお勧めします。

メモリ不足の例外が発生したかどうかを検討してください。単純に「pass」を使用しても、プログラムは良好な状態にはなりません。

ほとんどの場合、例外をキャッチする必要があるのは、プログラムのトップ レベルにあるときだけです。そこでは、ログに記録 (試行) し、エラーを表示して、できる限り適切に終了することができます。

于 2009-04-16T13:44:45.817 に答える
18

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

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

詳細と将来の計画については、PEP3110を参照してください。

于 2009-07-11T22:37:07.453 に答える
4

獲りすぎだと思うからです。そしてそれは正しいです。

于 2009-04-16T13:45:33.240 に答える
1

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

ここにpydocsのエラーの非常に便利なリストがあります

また、例外が発生した場所を見つけることができる非常に便利な traceback モジュールにも注意してください。「except: ...」のみを使用すると、ケースでどのエラーを使用するのが最適かがわかります。たとえば、次のコードを試してみてください (コメントを切り替えてください)。

import traceback
#absent = 'nothing'
try:
    something = absent
except  NameError:
    traceback.print_exc()
else:
    print("you get here only when you uncomment 'absent'") 
于 2011-07-15T23:51:56.323 に答える
1

何か例外が発生すると、例外が発生します。通常、プログラムが終了するのは良いことです。

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

于 2009-04-16T13:46:09.450 に答える
-1

(再発生させずに) 例外をキャッチすると、2 つの非常に悪い副作用があります。エラーが食べられるため、スタック トレースが失われますが、ctrl-c (またはオペレーティング システムのブレーク キー) もここで処理されます。

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

于 2009-05-03T07:37:11.870 に答える