されることがあります。Debug.Assert()?
-
02-07-2019 - |
質問
私はプロのソフトウェアエンジニアの約一年、卒業CS程度です。私は知らの主張をのC++とCが、ことはまだわからなかったためにクライアントまで、フルのC#と.純ました。
当社の生産コードを含まない主張も、私の質問はこ---
べきから利用を主張する当社の生産コードについて教えてください。場合は、その使用を最も適切でしょうか。うにしたい
Debug.Assert(val != null);
または
if ( val == null )
throw new exception();
解決
に デバッグしまいました。純2.0アプリケーション ジョン-ロビンに大きな節の主張.主なポイント:
- を主張する"と述べ.できないあまりにも多くの主張.
- 主張がな置き換えることができます。例外のものにコードを要求;主張カバーするものでは.
- してく主張できないだけで何が起きたのか、どのような例外が、いかがでしょうか。
- 例外のメッセージが隠必要作業対側のコードを再現することによりエラーとなります。主張できるプログラムの状態時にエラーが発生しました。
- の主張をダブルとして書かどう暗黙の仮定コードです。
- のダイアログが表示される際にアサーションが失敗きを添付してデバッガプロセスに、pokeのスタックとしてきたブレークポインあります。
PS:だが好きでコードが完全にオススメなのが以下です。いったいどうな学習を用いwindbgのダンプファイルが、上半期が満載のためのヒントを避けるバグ。
他のヒント
入 Debug.Assert()
のありとあらゆるところで活躍コードしたいしてチェ確保の不変量.ときにコンパイル、リリースの構築(つまり、 DEBUG
コンパイラの一定の通話を Debug.Assert()
削除されないように影響します。
だが例外をスローを呼び出す前に、 Debug.Assert()
.を主張するだけるようにするものではありどりますので、無理に押し込まないものです。
から コードの完了
8守グ
8.2の主張
主張がコードするのに使用中の開発—通常のルーチン またはマクロできるプログラムチェックしています。時 主張がtrueの場合、そのすべてが営業しています。きfalseの場合、そしたらストーリー作品やろうかが検出されました想定外のエラーの コードです。例えば、システムはお客様情報 ファイルを持ってはならないとしてい50,000人以上の記録には、プログラムが を含む"という主張のレコード数はlessthanまたは等しい る~50,000円です。どのレコード数は以下の 50,000、主張する。出すよ 50,000記録し、大きな声で"主張する"ことがあり エラーのプログラム。
主張に特に便利で大型、複雑なプログラム 高い信頼性です。が得られるため、プログラマーをより迅速に フラッシュウミスマッチなインタ仮定、エラーのクリープき コードが変更されます。
主張は、通常、二つの引数:boolean表現 を記述すると仮定して開いてしまう恐れが本当にメッセージ 表示されない。
(…)
通常、だいたいユーザーに主張メッセージ 生産コード主張が主に使用中の開発 およびメンテナンス。主張が正常にコンパイルして組み込むコード 開発時間の集計をコードしました。中 開発主張フラッシュ出相反する仮定、 予期せぬ条件の悪い値に渡されたルーチンです。生産途中でめのコードを 主張がな劣化、システムの性能に重要です。
FWIW...その公開方法を使用する傾向があるの if () { throw; }
パターンを確保する方法にすることが求められていますが。自分のための方法を使用する傾向がある Debug.Assert()
.
の考え方が自分のprivateメソッドは僕の管理下にない開始のお電話でも受け付け、自分の方法とパラメータ設備は、施設内または近辺にそっ壊れた自分の想定どこかにいるべきではなかっ頂いている状態です。生産は、これら民間主張すべき理想的には必要以来、私はっき続き私の内部状態に有効です。対照的に与えられたパラメータを公開方法を行うとともにいつでも、どこでも、誰にでもランタイム:まだ強制パラメータの制約がを投入することにより例外をスローしました。
また、私のprivateメソッドが例外をスローの場合な作品でランタイム(ネットワークエラー、データへのアクセスエラー、不良データから取得した第三者サービス。私の主張であるかないの折れ自身の内部に想定しの状態でオブジェクトです。
使用主張をチェック開発の前提と例外をチェック環境の前提になっていました。
またま入っていて:
Debug.Assert(val != null);
if ( val == null )
throw new exception();
をさけるための繰り返し条件チェック
if ( val == null )
{
Debug.Assert(false,"breakpoint if val== null");
throw new exception();
}
したい場合は主張する生産コード(リリースのビルドを使うことができました。主張の代わりにDebug.を主張する.
このコースに追加しのオーバーヘッド生産実行形式にまとめたものです。
またアプリケーションの場合は実行中に使用されるユーザインタフェースのモードでは、主張のダイアログが表示されますのでデフォルトでは、少しの迫力を豊かにするために利用できます
をオーバーライドすることができることによって、挙動を取り除くDefaultTraceListener:見てドキュメンテーションに依存します。リスナーにMSDN.
要約
利用デバッグ.張羅を獲バグデバッグ構造を作成する環境が整いました
ご利用の場合で配線します。主張に使用されるユーザインタフェースモジュールを使用したいと思うかもしれを削除しDefaultTraceListenerな迫力です。
場合の条件のい試験にもアプリでは対応できないある例外を行います。であったこと等により、ユーザが選択できる無視する主張が苦手ですね。
主張の使用くプログラマ(お)エラーはユーザエラーになります。使用する必要がある場合のみであり、ユーザーの原因となる主張しています。だ文書のAPIは、例えば、主張すべきでないチェックに使用される引数がnullでない場合には任意の方法は、APIユーザーが電話します。で使用できる民間のない方法に晒されておめのAPIとして存続していくためには、コードなパスにnull引数がな感と恐怖心を掻き立てられる。
また、普段は賛成例えを主張がなんなのか。
主になった。の大多数の場を確認することができますそれをcodeして投げればい分けるどれがいいですか?
私が嫌いだということでデバッグの構築の異なる機能をリリース。場合はデバッグを主張するに失敗したが、機能の作品をリリースしている為です。でも時にasserterは、当社ないし一部のコードです。しかし、"釣りスタ"なら釣りのお時間の問題になってしまうためですが本当に問題はない。であれば、問題はそうではない人を投げるのでしょうか。
私はこれを使用のデバッグ.主張だけを抽出する手法の問題を他の人に最適な処置を迅速に行う。だれのケースなしスロー.
かされることがあり、パフォーマンスが重視されるシナリオがしたい市場に出す前に指令に適合しているほうがはるかに主張すれば有用であり、しかし私はまだ出会いなど)。
短
Asserts
使用ガード確にシンプルなテキストエディタに制約に固:
Asserts
きのためのデバッグおよび非生産ビルドです。主張は無視され、コンパイラにリリース構造を作成する環境が整いましたAsserts
でバグチェック/予期せぬ条件については、制御システムAsserts
ない仕組みの第一線の検証のユーザー入力またはビジネスルールAsserts
すべ ない 使用する検出する想定外の環境条件(外部の制御コードの例のメモリ、ネットワーク故障、データベース故障等。少数ながら、これらの条件が変更される場合、アプリのコードが固定できな問題のようなハードウェア障害や資源の枯渇).通常は、例外がスローされ-お申し込み可能な次のいずれかの条件が成立する是正措置を実施します(例:リトライのデータベースやネットワーク運用の試みで無料キャッシュメモリ、または中止を優雅にの場合は例外ではな電着技術が施されております。- 失敗した主張は致命的なシステム(とは異なり除いたりしないようにしてくださいキャッチしたハンドに失敗した
Asserts
-コードにおいては想定外の領域です。スタックトレースとクラッシュダンプを指定するのに使用されますが何が起こったのかが間違っている。
主張して大きな利益:
- に集まることにより、異分欠損の検証のユーザー入力、またはバグの高レベルのコードです。
- 主張のコードベースを明確に伝える前提をコードリーダ
- 主張を確認する実行時に
Debug
構造を作成する環境が整いました - 一度にコードを網羅的に検討、再構築のコードとしてリリースの除去性能のオーバーヘッドを検証するとの前提での利益にその後のデバッグの構築を常に戻すの確認、必要に応じて
...詳細
Debug.Assert
を表現したい状態が存在すると予想されていな状態で残りのコードブロック内に制御します。この状態は、ご提供いただいたパラメータの状態のクラスのインスタンスを返すメソッドの呼び出しは、その契約/設計されます。通常、主張すべきクラッシュのスレッド/プロセス/プログラムは、すべての必要な情報(スタックトレース、クラッシュダンプ等)としての存在を示唆するバグまたはunconsideredいままでは設計されていた(いうキャッチまたは取扱いの主張の失敗は、この例外の場合の主張自体が原因により損傷以外のバグなど航空交通のコントローラなしたいYSOD時に航空機が海底では、議論の余地がある問題かどうかは、デバッグを構築すべきで展開する生産...)
きを起用すべき Asserts?
-のどの時点で、システムやライブラリAPIやサービスにインプットの機能または状態のクラスを想定して有効な例きに検証が行われているユーザー入力、表層のシステム事業、データ段の授業は通常、そのnullチェック範囲チェック、文字列の長さチェックなどに入力されている).-共通 Assert
チェックなどが無効な仮定が無効であることが判明したnullオブジェクト逆参照は、ゼロdivisor,数値や日付演算のオーバーフローは、一般のバンドな設計のための行動などの場合、32ビットのintを用いたモデルは、人間の年齢では慎重に Assert
この年代は0 125んどくさいのか、それとも値-100 10^10なっていない)。
.純コード契約
できます。純スタック コード契約 使用可能 また、代替として を使用 Debug.Assert
.コード契約の更なる盛り込み状態をチェックできる支援を検出する違反の想定~コンパイル時または、その後の場合、バックグラウンドチェックIDE).
シンプルなテキストエディタには(DBC)チェックで使用可能です:
Contract.Requires
-契約の前提条件Contract.Ensures
-契約PostConditionsInvariant
-を表す前の状況についてオブジェクトですべてのポイントがその長寿命化をもたらしました。Contract.Assumes
-pacifiesの静チェッカーが話を非契約に飾られた方法で行います。
に応じて IDesign標準, るべき
を主張する毎することが推定される。平均して、毎回線は主張が苦手ですね。
using System.Diagnostics;
object GetObject()
{...}
object someObject = GetObject();
Debug.Assert(someObject != null);
としての免責事項にあるかが見つからなかった場合で実践的な実用化に関連性のある投稿.これは標準装備。
使用主張する場合に限りがいを外してチェックをリリース構造を作成する環境が整いました覚え、主張しませんかない場合にはコンパイルにデバッグモードになります。
与えられチェックインのためのnullとえば、これは内部専用のAPIを使い、主張が苦手ですね。の場合は、公開APIには、坂道が多いので、車かタクシーの明示的なチェック、スロー.
すべての主張すべきでコードが最適化される:
Debug.Assert(true);
でチェックなんて想定します。E.g.:
public static void ConsumeEnumeration<T>(this IEnumerable<T> source)
{
if(source != null)
using(var en = source.GetEnumerator())
RunThroughEnumerator(en);
}
public static T GetFirstAndConsume<T>(this IEnumerable<T> source)
{
if(source == null)
throw new ArgumentNullException("source");
using(var en = source.GetEnumerator())
{
if(!en.MoveNext())
throw new InvalidOperationException("Empty sequence");
T ret = en.Current;
RunThroughEnumerator(en);
return ret;
}
}
private static void RunThroughEnumerator<T>(IEnumerator<T> en)
{
Debug.Assert(en != null);
while(en.MoveNext());
}
上記が異なるアプローチをnullパラメータ。最初の受け入れで許容(それだけでは何も行いません).第二の例外がスローを呼び出すためのコードの扱いなので、エラーメッセージ).第三はできないよう、という主張をしています。
前者の場合、問題はありません。
後者の場合、ある問題を呼び出すコードでないという GetFirstAndConsume
nullでない例外です。
第三の場合、ある問題をこのコードですべて確認する en != null
で呼ばれるようになtrueです。すなわち、このコードが理論的に最適化される Debug.Assert(true)
,sicne en != null
必ず true
!
と思ったの追加により場合によっては、デバッグ.を主張するので便利です。
1) ないといけないと思っていないのであることが明らかにされた。 追加の概念険の主張を提供できる時に自動検査.単純な例として:
が高いレベルの呼び出し側により変更された者は考えてい範囲を拡大しましたのコードを追加シナリオ想(!) その書きのユニットテストの場合は、この新しい状態です。であること完全に統合コードが表示される。
しかし、実際に微妙な傷が紹介されていないが検出された試験結果です。の相手先となってい非決定的なこの場合、 起 の提供を期待する。のでしょうか炉では四捨五入しているとエラーが表示されたのです。または起因する誤差が相殺されたため同様に。の権限のアクセス要求が追加の権限のあるべきではない認められることがあります。など。
この時点で、デバッグ.Assert()諸表に含まれる相手先の新規の場合(または端の場合)駆動ユニット試験を提供できる貴重な通知を試験中は原著作者が想定して無効にコードさせないな。主張ユニットテストに最適なパートナーです。
2) また、 いくつかの試験のシンプルに書きだが、高コストや不要なたの最初の想定.例えば:
場合にはオブジェクトのみがアクセス可能でにかかる担保のエントリポイント、追加のクエリーするネットワークに権データベースからオブジェクトの方法を呼び出し側が許可?確かにいません。その理想的なソリューションを含むキャッシュや他の拡張機能、デザインを必要としないのです。Debug.Assert()はすぐにショーのオブジェクトが取り付けが不安なので入ります。
3) 次に、場合にお 製品についても診断の相互作用の全部又は一部の事業が展開されリリースモード.例えば:
ではないでしょうかは、組込みリアルタイム装置です。投例外および再起動時の出会いの不正なパケットカウンターの生産性が向上。共に、やむを得ない事由によりデバイスを利用される最善の努力を払った上での操作そのものをレンダリングノイズに出力されます。でも持っていないヒューマンインタフェースおよびロギング装置、物理的にアクセスによる人間が展開されリリースモード、意識の誤差が最高による評価が同じ出力に出力します。この場合には、リベラルの主張は、徹底した事前リリース試験ますが例外をスローしました。
4) 最後に、 一部の試験は数値だけでは、相手先として非常に信頼性の高い.ほとんどの場合、再利用可能なコードを引き出すためには、努力を入れができます。そのために共通するの例外のために予想外のパラメータからの呼び出し側が主張するために予想外の結果からcallees.例えば:
場の中核 String.Find
運転状態を返します -1
が検索条件が見つからないところもありますので、安全に行うために、ひとつの作業です。ただし、実際に返される -2
, できない可能性があり合理的な起こります。この辺に置き換え単純な計算と試験には別途 -1
値を、無理にリリース環境をみコード試験の確保のコアライブラリを運営しています。この場合の主張には理想的です。
見積もりから の実践的なプログラミング:からJourneymanマスター
休主張っ
が普通について誤解を主張が公布による を書く人にはコンパイラや言語環境です。その のようなこと:
主張の追加のオーバーヘッドコードです。でチェックのためのもの うなものだけがのみによるバグの コードです。一度のコードについて、出荷されなくなっ 必要であり、オフにする必要があります、コードの実行が速くなります。主張してデバッグ施設です。
が十間違った前提です。まず、その 試験をすべて検索をございます。実際に、複雑なプログラムで は試験でも微率の組み合わ コードがあること(Ruthlessする
第二に、楽観論が忘れるプログラムが走 危険です。試験中に、ラットかgnawを通じて 通信ケーブル、ゲームな排気メモリ、 ログファイルなのを破壊することはありません。これらのこもれるようにすることが プログラムを運生産環境です。第一線の 防衛するかを確認し、他の誤り、第二の使用 主張して検出方だけます。
Offの主張の際にお願いしたいと思いプログラムを生産 ような交差点の高いワイヤーなしの純できます 全体練習.が劇的な価値でなく、生命 保険。
ものが発見された場合には性能の問題で電源をお切りくださみ 主張するいます.
しなければなりません利用目的例外を投げ).
もん生産してリリース-ビルド)によると良い例外をスローする(ようになりましたアプリクラッシュ、最悪の場合)以上の作業は無効値をも破壊するお客様のデータであり千ドル)となる。
のものを使用できるデバッグ.張試験のための論理エす。のcomplierでご連絡の構文エラー.そのスキー装着の使用を主張する諸表の試験のための論理エラー。ように試験プログラムを販売している車が子様の年齢を入力してくださいする青色は15%割引になります。のcomplierがいない場合はプログラムから論理的に正しく行うことが主張する声明でした。
私の答えがここにしようと考えたん追加の重要な区別するあるさまざまな主張を使用します。ていることを仮ーショートカットのための"こんな本当に起こっているのでせうんどうなるのか、などの条件付きブレークポイントを扱う場合にはプログラムができます。その他、どう仮定に有効なプログラムの国コードで.
最初の場合の主張でもない、最終のコードです。のものを使用できる Debug.Assert
開発中のとき削除した場合の場合は必要ない。したい場合は、いったんは忘れてしまった場合は、削除して問題なしてい結果にリリース編集.
がの場合の主張の一部のコードです。彼らは、を主張し、その前提が真であり、また文書です。その場合、またはコードです。場合には、本プログラムに無効な状態でしていることも必要であって続けます。ませんでしたが、少し足を延ばせばいになるC#.一方であることができて便利で取り付けてデバッガの場合などが挙げられる。のんのスタックトレースのポップアップユーザもますます重要によってお使いることができるように無視されます。また、このサービスでは常に無視されます。そのため、生産の正しい行動が例外をスローすると、通常の例外のお取扱いについてプログラムが、ユーザーの素敵なメッセージログインしてみます。
Trace.Assert
るということにある。ん取り除き、生産用いて、構成することができます異なるリスナーを使用アプリです。config.そのために開発、デフォルトのハンドラは、生産までをTraceListener以下のようにする例外をスローしますと起動するのconfigファイルです。
using System.Diagnostics;
public class ExceptionTraceListener : DefaultTraceListener
{
[DebuggerStepThrough]
public override void Fail(string message, string detailMessage)
{
throw new AssertException(message);
}
}
public class AssertException : Exception
{
public AssertException(string message) : base(message) { }
}
の生産コンフィグファイル:
<system.diagnostics>
<trace>
<listeners>
<remove name="Default"/>
<add name="ExceptionListener" type="Namespace.ExceptionTraceListener,AssemblyName"/>
</listeners>
</trace>
</system.diagnostics>
わからないのでクライアントまで、フルのC#と.NET、Cを主張する()のみの場合デ-DDEBUGのenduserことができなくなってassert()まとめます。この開発者にとってはユーザーのみです。使っても本当に多く、時にやトラックさせてしまいます。
私は使用しないでく生産す。例外をスロー、およびログです。
も注意が必要でasp.netとして主張できる最大のコンソールおよび凍結を要求します。