web-dev-qa-db-ja.com

例外対アサート?

可能性のある複製:
契約テストによるアサートまたは例外による設計

アサートの代わりに例外を使用する(またはその逆)ことを決定する際に従うべき経験則はありますか?現時点では、実行中にユーザー側で発生すると思われる何か(ソケットエラーやファイルエラーなど)が発生した場合にのみスローします。私が使用する他のほとんどすべてがアサートします。

また、アサートをスローする場合、スローするNice標準オブジェクトは何ですか? IIRC std :: logic_errorがありますが、これはスローするのに適したオブジェクトではありませんか?欠落しているファイルや予期しない入力(フロントエンドアプリではなくコマンドラインからの入力など)に対して何をスローしますか?

45
user34537

私の経験則:

例外は、実行時エラー条件(IOエラー、メモリ不足、データベース接続を取得できないなど)に使用されます。

アサーションはコーディングエラーに使用されます(このメソッドはnullを受け入れず、開発者はいずれにしてもnullを渡します)。

パブリッククラスを持つライブラリの場合は、パブリックメソッドに例外をスローします(そうすることには意味があるため)。アサーションは、自分の間違いではなくあなたの間違いを見つけるために使用されます。

編集:null値の例のため、これは完全に明確ではない場合があります。私のポイントは、(他の人が指摘したように)決して発生してはならない条件、それを製品コードにしてはならない条件に対してアサーションを使用することです。これらの条件は、ユニットテストまたはQAテスト中に絶対に失敗する必要があります。

39
Mike Hofer

あなたがknowできないことをアサートします(つまり、それが起こった場合、それは無能であることの責任です)。

プログラムの通常の制御フローでは処理されない例外的な状況を引き起こします。

18
Afd

私はアサートを次のものに使用します 決して起こらないはずです、まだ行います。このようなことが起こった場合、開発者は誤った仮定を再検討する必要があります。

他のすべてに例外を使用します。

再利用可能なコードでは、呼び出し側が問題を処理するかどうかを選択できるので、例外を好みます。アサートをキャッチして処理してみてください!

2
Paul Beckingham

exceptionalの状況では例外を使用します。たとえば、メモリ不足の状況やネットワーク障害などです。

アサートを使用して、特定の前提条件が満たされていることをascertainとします。たとえば、ポインタがNULLではないか、整数が特定の範囲内にあります。

2
Toon Krijthe

アサートは、プログラムが可能な状態にあることを確認する手段です。関数が正の整数のみを返す必要があるときに-1を返し、それを検証するアサートがある場合、プログラムが危険な状態になるため、プログラムは停止する必要があります。

2
Loki

原則として、以下から例外をスローします。

  1. プログラミングエラーをキャッチするパッケージのパブリック関数。
  2. システムエラーまたはパススルーサブシステムエラーを報告する内部関数。

内部でのみアサートを使用して、実装の誤りをキャッチしています。

1
donpark