101

PyCharm IDEを使用する場合except:、例外タイプなしで使用すると、この例外句がであるというIDEからのリマインダーがトリガーされますToo broad

このアドバイスを無視する必要がありますか?それとも、例外タイプを常に指定するのはPythonicですか?

4

7 に答える 7

97

ほとんどの場合、明示的な例外タイプを指定することをお勧めします。ネイキッドexcept:句を使用すると、予期したもの以外の例外をキャッチする可能性があります。これにより、バグが隠れたり、プログラムが期待どおりに動作していない場合にプログラムのデバッグが困難になる可能性があります。

たとえば、データベースに行を挿入する場合、その行がすでに存在することを示す例外をキャッチして、更新を実行できるようにすることができます。

try:
    insert(connection, data)
except:
    update(connection, data)

ベアを指定するexcept:と、データベースサーバーがフォールオーバーしたことを示すソケットエラーも発生します。処理方法を知っている例外のみをキャッチするのが最善です。プログラムが例外の時点で失敗する方が、続行するよりも、予期しない奇妙な動作をする方がよい場合がよくあります。

ベアを使用したい場合の1つexcept:は、ネットワークサーバーのように、常に実行する必要のあるプログラムのトップレベルです。ただし、例外をログに記録する場合は十分に注意する必要があります。そうしないと、何が問題になっているのかを特定できなくなります。基本的に、これを行うプログラムにはせいぜい1つの場所しか存在しないはずです。

これらすべての当然の結果として、raise Exception('some message')クライアントコードを強制的に使用する(またはほぼ同じくらい悪い)ため、except:コード絶対に実行しないでください。通知する問題に固有の例外を定義する必要があります(またはなどの組み込みの例外サブクラスから継承する場合があります)。または、特定の組み込み例外を発生させる必要があります。これにより、コードのユーザーは、処理したい例外だけを注意深くキャッチできます。except Exception:ValueErrorTypeError

于 2013-02-10T12:01:51.707 に答える
41

通訳者のアドバイスを無視してはいけません。

PythonのPEP-8スタイルガイドから:

例外をキャッチするときは、そのままの except: 句を使用する代わりに、可能な限り特定の例外について言及します。

たとえば、次を使用します。

 try:
     import platform_specific_module 
 except ImportError:
     platform_specific_module = None 

そのままの except: 句は、SystemExit および KeyboardInterrupt の例外をキャッチし、Control-C でプログラムを中断するのを難しくし、他の問題を隠すことができます。プログラム エラーを通知するすべての例外をキャッチする場合は、except Exception: を使用します (bare except は except BaseException: と同等です)。

経験則として、そのままの 'except' 句の使用を 2 つのケースに制限することをお勧めします。

例外ハンドラーがトレースバックを出力またはログに記録する場合。少なくとも、ユーザーはエラーが発生したことに気付くでしょう。コードで何らかのクリーンアップ作業を行う必要があるが、raise を使用して例外を上方に伝播させる場合。try...finally は、このケースを処理するためのより良い方法です。

于 2013-02-10T11:54:23.287 に答える
9

これはPythonに固有のものではありません。

例外の全体的なポイントは、問題が発生した場所にできるだけ近い場所で問題に対処することです。

したがって、例外的な状況で問題と解決策が互いに「隣接」して発生する可能性のあるコードを保持します。

問題は、コードの一部によってスローされる可能性のあるすべての例外を知ることはできないということです。あなたが知ることができるのは、それがファイルが見つからないという例外である場合、それをトラップし、機能を実行するかキャンセルするようにユーザーに促すことができるということだけです。

それを試してみると、ファイルルーチンにどのような問題があったとしても(読み取り専用、アクセス許可、UAC、実際にはpdfではないなど)、すべてのユーザーがファイルにドロップインします。 「しかし、そこにある、このコードはがらくた」と叫んでいます

今、あなたがすべてを捕まえるかもしれないいくつかの状況があります、しかしそれらは意識的に選ばれるべきです。

それらはキャッチされ、いくつかのローカルアクション(リソースの作成やロックなど(たとえば、書き込みのためにディスク上のファイルを開く)を元に戻し、次に例外を再度スローして、より高いレベルで処理されます)

もう1つは、なぜそれがうまくいかなかったのか気にしないということです。たとえば、印刷。プリンタに問題があると言って、それを整理してください。それが原因でアプリケーションを強制終了しないでください。コードが何らかのスケジュールを使用して一連の個別のタスクを実行した場合、タスクの1つが失敗したため、すべてが停止することは望ましくありません。

注上記の場合、例外ログの種類をお勧めすることはできません。たとえば、catchlogendを試してみてください。

于 2013-02-10T12:20:07.050 に答える
3

また、たとえばControl-Cもキャッチするので、もう一度「投げる」場合を除いて、キャッチしないでください。ただし、その場合は、むしろ「最終的に」使用する必要があります。

于 2013-02-10T11:45:07.533 に答える
3

常に例外タイプを指定します。 、、などSyntaxError、キャッチしたくないタイプが多数あります。KeyboardInterruptMemoryError

于 2013-02-10T11:45:31.977 に答える
-14

これを試して:

try:
    #code
except ValueError:
    pass

このリンクから回答を得ました。他の誰かがこの問題に遭遇した場合は、チェックしてください

于 2017-06-26T23:53:43.193 に答える