本の主な論点は、独自のエラーチェックを記述しようとした場合に見落としていた可能性のあるものをすべてキャッチするため、例外バージョンのコードの方が優れているということです。
このステートメントは、出力が正しいかどうか気にしない非常に特定の状況でのみ当てはまると思います。
例外を提起することは、健全で安全な習慣であることは間違いありません。(開発者として)対処できない、または対処したくないプログラムの現在の状態に何かがあると感じるときはいつでもそうすべきです。
ただし、例は例外をキャッチすることです。例外をキャッチした場合、見落としている可能性のあるシナリオから身を守ることはできません。あなたはまったく逆のことをしています:このタイプの例外を引き起こす可能性のあるシナリオを見逃していないと仮定しているため、それをキャッチしても大丈夫だと確信しています(したがって、プログラムが終了するのを防ぎます)キャッチされない例外と同様に)。
例外アプローチを使用して、例外が表示された場合はValueError
、行をスキップします。従来の非例外アプローチを使用して、から返される値の数をカウントし、split
2未満の場合は1行スキップします。従来のエラーチェックでは他の「エラー」状況を忘れてしまった可能性があるため、例外アプローチを使用してより安全に感じる必要がありexcept ValueError
ますか?
これは、プログラムの性質に依存します。
たとえば、Webブラウザーやビデオプレーヤーを作成している場合、入力に関する問題が原因でキャッチされない例外でクラッシュすることはありません。終了するよりも、リモートで分別のあるものを出力する方が(厳密に言えば、正しくない場合でも)はるかに優れています。
正確性が重要なアプリケーション(ビジネスソフトウェアやエンジニアリングソフトウェアなど)を作成している場合、これはひどいアプローチになります。を発生させるいくつかのシナリオを忘れた場合ValueError
、あなたができる最悪のことは、この未知のシナリオを静かに無視し、単に行をスキップすることです。これは、ソフトウェアに存在する非常に微妙で費用のかかるバグです。
ValueError
このコードで確認できる唯一の方法は、split
返される値が(2つではなく)1つだけであると考えるかもしれません。しかし、ある条件の下print
で発生する式を後で使用してステートメントが開始したらどうなるValueError
でしょうか?これにより:
、が見つからないためではなく、print
失敗するために一部の行がスキップされます。これは私が以前言及した微妙なバグの例です-あなたは何も気付かないでしょう、ただいくつかの行を失います。
私の推奨事項は、不正な出力の生成が終了するよりも悪いコードで例外をキャッチしないようにすることです(ただし、発生させないでください!)。そのようなコードで例外をキャッチするのは、本当に些細な式があるときだけです。そのため、考えられる例外タイプのそれぞれの原因を簡単に推論できます。
例外を使用した場合のパフォーマンスへの影響については、例外が頻繁に発生しない限り、それは簡単です(Pythonで)。
定期的に発生する条件を処理するために例外を使用する場合、場合によっては膨大なパフォーマンスコストを支払う可能性があります。たとえば、何らかのコマンドをリモートで実行するとします。コマンドテキストが少なくとも最小限の検証(構文など)に合格することを確認できます。または、例外が発生するのを待つこともできます(これは、リモートサーバーがコマンドを解析して問題を見つけた後にのみ発生します)。明らかに、前者は桁違いに高速です。別の簡単な例:除算を実行してZeroDivisionError例外をキャッチするよりも、数値が0から10倍速いかどうかを確認できます。
これらの考慮事項は、不正な形式のコマンド文字列をリモートサーバーに頻繁に送信するか、除算に使用するゼロ値の引数を受け取る場合にのみ重要です。
注:except ValueError
ちょうどの代わりに使用すると仮定しますexcept
。他の人が指摘したように、そして本自体が数ページで述べているように、決してbareを使用すべきではありませんexcept
。
別の注意:適切な非例外アプローチはsplit
、を検索するのではなく、によって返される値の数をカウントすることです:
。後者はsplit
、実行される作業を繰り返し、実行時間をほぼ2倍にする可能性があるため、非常に遅いです。