アサートは(通常)デバッグのみです
「アサート」の問題は、通常はデバッグ バイナリにあり、一部の開発者は、コードがまだ本番環境にあるかのように使用することです。
コードは集中的にテストされるはずなので、これ自体は悪ではありません。したがって、アサートを生成するバグは確実に発見され、削除されます。
しかし、場合によっては (ほとんどの場合?)、テストが必要なほど集中的ではないことがあります。最後の最後までコーディングしなければならなかった古い仕事については話しません (聞かないでください... 時々、マネージャーはただ... ええと... )... assert のポイントは何ですか?次の分にクライアントにリリース バイナリとしてコンパイルおよび配信されるコードに追加しますか?
(いくつかの) 実際のアプリケーションでアサートする
私たちのチームでは、エラーを検出するための何かが必要でしたが、同時にエラーを処理するための何かが必要でした。そして、Release Build でそれが必要になる可能性がありました。
Assert は、デバッグ ビルドでのみエラーを検出して処理します。
そのため、代わりに XXX_ASSERT マクロと XXX_RAISE_ERROR マクロを追加しました。
XXX_ASSERT マクロは ASSERT マクロと同じことを行いますが、デバッグとリリースの両方でビルドされます。その動作 (ログを書き込む、メッセージボックスを開く、何もしないなど) は .INI ファイルで制御でき、その後、アプリケーションを中止/終了します。
これは次のように使用されました。
bool doSomething(MyObject * p)
{
// If p is NULL, then the app will abort/exit
XXX_ASSERT((p != NULL), "Hey ! p is NULL !") ;
// etc.
}
XXX_RAISE_ERROR マクロは、エラーを「記録」するだけで、それを処理しようとはしませんでした。これは、メッセージをファイルに記録したり、MessageBox を開いてメッセージを表示したり、続行するためのボタンや、(.INI ファイルの構成に従って) デバッグ セッションを開始するための別のボタンを開いたりできることを意味します。これは次のように使用されました。
bool doSomething(MyObject * p)
{
if(p == NULL)
{
// First, XXX_RAISE_ERROR will alert the user as configured in the INI file
// perhaps even offering to open a debug session
XXX_RAISE_ERROR("Hey ! p is NULL !") ;
// here, you can handle the error as you wish
// Than means allocating p, or throwing an exception, or
// returning false, etc.
// Whereas the XXX_ASSERT could simply crash.
}
// etc.
}
私たちのライブラリに導入されてから 1 年後、XXX_RAISE_ERROR のみが使用されています。もちろん、アプリのタイム クリティカルな部分では使用できません (そのための XXX_RAISE_ERROR_DBG があります) が、それ以外の場合は問題ありません。また、好みのエラー処理を使用でき、開発者のコンピューター、テスター、またはユーザーのいずれかで自由にアクティブ化できるという事実は、非常に役立ちます。