これは、SCombinatorの回答を拡張したものにすぎません。
あなたが「これは決して起こらないはずだ」と言ったという事実。例外(または2つの組み合わせ)ではなく、アサートを使用することを意味します。例外はエラーを非表示にします-まあ、非表示ではありませんが、それをキャッチして続行することはできます。これは、実際には計画していなかった例外的な状況(たとえば、存在しないファイルを開こうとしている場合)に適しています。ファイルが欠落しているのは実際には論理の一部ではありません。弟が誤ってファイルを削除したり、ウイルスだと思った攻撃的なアンチウイルスなどです。これは例外的な状況です。
同じIDを持つが、それ以外は異なるメンバーが決して起こらないものである場合、それは基本的にアサーションです。これはロジックの一部であり、必要に応じて要件の一部です。例外をスローすると、これが指摘されるだけですが、実際には例外から回復する方法はありません。何かがおかしいことに気付く頃には、もう2つ遅れています。同じIDであるが異なる2つのオブジェクトがあり、どちらが正しいか、なぜ間違ったオブジェクトが存在するかなどがわかりません。あなたはおそらくそれから回復したくないでしょう。アプリケーションはすでに誤った状態にあります-2つの矛盾するオブジェクトがすでに存在します。アプリケーションは回復不可能な状態にあります。続行すると、間違った結果が得られるか、さらに悪い結果になる可能性があります。
重要なアサーションでない場合は、後で例外をスローして、アプリケーションを閉じるためのクリーンな方法を提供することもできますが、これは単なる美化です。
一般的に、私は単純なルールに従います-それが異常な状況で発生する可能性がある場合は、例外を使用します。それが決して起こらないはずの何かであり、それが起こった場合、コードのロジックに深刻な問題があることを意味する場合、私はアサーションを使用します(そしておそらく強制クラッシュ)。