2011-01-31 12 views
9

予期しない条件のアサーションを持つことは、優れた防御的コーディング手法とみなされます。予期せぬことが起こるかもしれないと思うときはいつでも、私はアサーションを置くことがあるが、それは今や私にとって過酷であるようだ。アサーションを入れる場所は?

また、必ずしもクラッシュするとは限らない軽度の予期せぬ状態が、顧客側で障害を引き起こすことさえあります。

アサーションを作成するための厳しいルールがありますか?

ありがとうございました。

答えて

0

アサーションは、コードの次のレベルに進む前にいくつかの条件が満たされている必要があることを確信しているときに置かれます。たとえば、ウィンドウハンドルが無効な場合や、一部の変数が有効な値を持たない場合などです。

0

そのサウンドから、リリースビルドで有効にしたままにしておきます。そうであれば、特定のビルドで有効または無効になるレベルのアサーションを作成します。アサーションレベルを使用してください。

このようにして、開発やデバッグビルドやベータ版では、これらをオフ、オフ、または削除する必要はありません。

通常、私はリリース時にそれらを無効にしますが、それらは大量のコードを消費します。私はそれが悪いとは思わない - それはドキュメンテーションとして機能し、インターフェイスが意図したとおりに使用されるように強制する。多くの開発者があまりにも多くのアサーションを考慮しているのは良いことだと思いますが、コードベースが進化し、プログラムが常に意図どおりに使用されるため、大きな画像にはあまり多くありません。したがって、それらを削除することはお勧めしません。リリースビルドの致命的でないチェックを無効にするだけです。

は最終的に、レベル(以下の議論を見て、あなたが他の人の回答から欲しいものを取る)より良いアプローチがある - しかし、レベルがかなり既存のプログラムに影響を与えずに変更を導入する一つの簡単な方法です。これは、別のエラー処理スキームへの移行のための良いアプローチ、またはあなたがすでに持っていることに98%以上満足している場合に適しています。

+2

私は以前はアサーションのレベルで考えていましたが、テストで捕捉されたエラーがプロダクションで検出されなかった場合は非常に驚きです。さらに、私は、開発者は通常どのレベルが適用されているかわからず、気分に応じて多かれ少なかれ選択したことを知りました... –

+0

@Matthieu素晴らしい点 - 指定された致命的な条件ハンドラ(および警告またはログメッセージ)必要に応じて、本番用のアサーションを無効にします。もちろん、これはOPの致命的なエラー状態の比率と既存のコードがどのように実装されているかによって異なります。可能であれば私のコードは例外なく、エラーコード/状態は単に検出されたときや遭遇したときに呼び出し元にプッシュされます。既存のプログラムを書き換えるのはかなり面倒なことがあるので、既存のコードにはあまり影響を与えない解決策としてレベルを提案しました。 – justin

2

いいえありませんが、テストとプロダクションで異なるアサーションを処理することをお勧めします。

テスト環境では、コアダンプを生成するのは大丈夫です。それは、プログラムの状態全体をきちんと安全に保つことによって、アサーションを引き起こした状態を容易に検査することを可能にする。

しかし、実稼働環境では、(メモリ破損の場合を除いて...)クラッシュすることはありません。ユーザーはシステムが常に応答することを期待しています。何かを要求しても応答を受け取ることがないということは何も刺激的なものではありません。したがって、たとえエラーメッセージであっても、ユーザーがより意味のある応答を取れるようにすることがあなたの仕事です。これを達成する最も簡単な方法は、通常、例外をスローすることです。

5

ここでアサーションを挿入しますか?

見落とされることが多いのは、アサーションがドキュメント援助の役割を果たすことができることです。

だから、また、あなたのコード内の重要なポイントであなたの仮定(不変量)を表現するためにそれらを使用する「予想外」のためだけでなく、テストを行います。他の人がここで指摘したように同様assert(high >= low)

そしてもちろんのは、それらを条件付きにします。

+0

+1不変量。 – murrekatt

6

アサーションと例外を使用する際の主な違い:

  • は、プログラミングエラーがキャッチするためのアサーションを使用してください。コードが正しく書かれていれば、アサーションは決して起こらないはずです。

  • 予期しない環境に起因する実行時エラーをキャッチするために例外を使用します。

  • プログラムがファイルからスクリプトまたはコンテンツを読み込み、期待されるフォーマットと一致しない場合、これは実行時の条件だと考えられます。

あなたはを挿入例外マクロを使用することができますが、例外はそれが投げてしまった場所をより容易に作業できるようにするには、単純にスローされた場所でアサーションを使用するために、デバッグ目的のために、決めることができますFILELINEにもメッセージを送ります。

+1

+1アサーションと例外の明確な区別 – davka

関連する問題