Assertion (アサーション)
Assert とは?
- ある式・値が想定したものになっているかを確認する関数。
- 引数が
true
の時何もせず、false
の時異常を出してプログラムを終了させる。
- 一般的にはある変数が期待した値になっているかを判定する式を引数として食わせる。
- デバッグビルド時には動作し、リリースビルド時には実行されない。(確認作業も含めて)
int i = 0;
Debug.Assert(0 <= i);
// OK
i = -1;
Debug.Assert(0 <= i);
// Error !!
#include <assert.h>
void assert(
expression
);
NDEBUG
マクロが定義されていない時は処理されて、定義されているときには処理されない。
expression
が 0
[偽] の場合、どこで問題があったのかを表示して、プログラムを停止させる。
- プログラムを殺すという機能から、組み込み環境でも提供されているかは環境によると思います。
namespace System.Diagnostics {
public static class Debug {
[ConditionalAttribute("DEBUG")]
public static void Assert(
bool condition
);
}
}
- Debug ビルドの時は処理されて、それ以外では処理されない。
- 引数
condition
が true
の時何もせず、 false
の時異常を出す。
- Windows アプリケーションの場合は、メッセージボックスが出て
中止
, 再試行
, 無視
を選べる。
例外との違い
- 例外は、その後処理することを前提としているが、
Assert
はプログラムの終了を前提としている。
- なので、その状況が想定の範囲内の異常値の場合は例外、設計上ありえない場合は
Assert
を使用する。
- 外部からの入力値の異常を示すときは
ArgumentException
を利用する。
- 内部の設計上、『そこにその値が入っている時点でバグ』といった場合には
Debug.Assert
を利用する。
Assert
は問題があった時点でプログラムが終了するので、『待っていたらそのうちおかしな値になる』場合には不向き(この場合はログを取った方がいい)