セットアップ:簡単なテストケースで[DebuggerNonUserCode]をデバッガから例外を隠すには?
1)MSVS 2015、オプション - >デバッガ - > "マイコードのみ" がチェックされています。
2)このサンプルコード起動時にいくつかのクラス内に配置され、呼び出された:
static bool TestIgnoreException()
{
Exception ex;
return TrySomething(out ex);
}
[DebuggerNonUserCode] // Prevent exceptions from stopping the debugger within this method.
static bool TrySomething(out Exception exOut)
{
try
{
if (Environment. MachineName.Length != -1)
throw new Exception("ThrewIt.");
exOut = null;
return true;
}
catch (Exception ex)
{
exOut = ex;
return false;
}
}
3)起動デバッガ
期待される結果はTestIgnoreException()はサイレントモードで実行され、falseを返すことです。
実際の結果は、そのスコープで処理される例外がなくても、TestIgnoreException()でデバッガが停止します。また【DebuggerHidden】代わりに、同じ結果を使用して再試行
4)。
動機:
動機は、あなたのコントロール外にあるいくつかのAPIは、「お試し」の方法を提供し、代わりにのみ、例外を使用して失敗したことを示していない場合のためです。
このような例の多くは、.NET TcpClient.Connect(host、port)です。起動時にプログラムが常にいくつかの接続をテストすると、デバッガは毎回この特定のコードセクションで停止するべきではないとします。
「例外発生時の例外」チェックボックスを使用するのは、タイプによってグローバルに機能するため不適切です。ローカルで作業するように構成することはできません。また、コードをチェックアウトする他の開発者も自動的に例外をスキップする必要があります。
ただ、 "この例外の種類がスローされたときにブレーク" チェックボックスを外します。問題は解決され、これのいずれかの必要はありません。 –
それは望ましくないそのタイプのすべての例外で停止します。また、もう一つの動機は、コードをチェックアウトする他の開発者が例外を目撃してはならないということです(低レベルのネットコードのレイズと同様)。また、何かがここで壊れているようですが、[Debug *]属性と思われます。 – crokusek
いいえ、あなたはそれを後方に持っています。デバッグ> Windows>例外設定ダイアログがどのように機能するかを学び、F1を押して開始してください。属性によってこの動作を変更できるというあなたの前提は間違っています。 –