可能性のある複製:
契約テストによるアサートまたは例外による設計
アサートの代わりに例外を使用する(またはその逆)ことを決定する際に従うべき経験則はありますか?現時点では、実行中にユーザー側で発生すると思われる何か(ソケットエラーやファイルエラーなど)が発生した場合にのみスローします。私が使用する他のほとんどすべてがアサートします。
また、アサートをスローする場合、スローするNice標準オブジェクトは何ですか? IIRC std :: logic_errorがありますが、これはスローするのに適したオブジェクトではありませんか?欠落しているファイルや予期しない入力(フロントエンドアプリではなくコマンドラインからの入力など)に対して何をスローしますか?
私の経験則:
例外は、実行時エラー条件(IOエラー、メモリ不足、データベース接続を取得できないなど)に使用されます。
アサーションはコーディングエラーに使用されます(このメソッドはnullを受け入れず、開発者はいずれにしてもnullを渡します)。
パブリッククラスを持つライブラリの場合は、パブリックメソッドに例外をスローします(そうすることには意味があるため)。アサーションは、自分の間違いではなくあなたの間違いを見つけるために使用されます。
編集:null値の例のため、これは完全に明確ではない場合があります。私のポイントは、(他の人が指摘したように)決して発生してはならない条件、それを製品コードにしてはならない条件に対してアサーションを使用することです。これらの条件は、ユニットテストまたはQAテスト中に絶対に失敗する必要があります。
あなたがknowできないことをアサートします(つまり、それが起こった場合、それは無能であることの責任です)。
プログラムの通常の制御フローでは処理されない例外的な状況を引き起こします。
私はアサートを次のものに使用します 決して起こらないはずです、まだ行います。このようなことが起こった場合、開発者は誤った仮定を再検討する必要があります。
他のすべてに例外を使用します。
再利用可能なコードでは、呼び出し側が問題を処理するかどうかを選択できるので、例外を好みます。アサートをキャッチして処理してみてください!
exceptionalの状況では例外を使用します。たとえば、メモリ不足の状況やネットワーク障害などです。
アサートを使用して、特定の前提条件が満たされていることをascertainとします。たとえば、ポインタがNULLではないか、整数が特定の範囲内にあります。
アサートは、プログラムが可能な状態にあることを確認する手段です。関数が正の整数のみを返す必要があるときに-1を返し、それを検証するアサートがある場合、プログラムが危険な状態になるため、プログラムは停止する必要があります。
原則として、以下から例外をスローします。
内部でのみアサートを使用して、実装の誤りをキャッチしています。