3

コンソールがクラッシュしないように、try-catch ブロックでラップした C# のコマンド ライン プログラムがあります。ただし、デバッグ中に DoStuff() メソッドのどこかで例外がスローされると、Visual Studio は "catch" ステートメントで中断します。例外が発生した場所で Visual Studio を中断させたい。これを行う最善の方法は何ですか?

トライをコメントアウトしますか?
Visual Sudioの設定?
#if DEBUG ステートメント?

static void Main(string[] args)
{
    try
    {
        DoStuff();
    }
    catch (Exception e)
    {  //right now I have a breakpoint here
        Console.WriteLine(e.Message);
    }
}

private void DoStuff()
{
    //I'd like VS to break here if an exception is thrown here.
}
4

4 に答える 4

8

VSで最初のチャンスの例外を有効にすることができます。これにより、例外が発生するとすぐに通知を受けることができます。

于 2009-01-08T03:19:38.600 に答える
4

キャッチされていない例外でブレークするようにVS を設定し、try/catch を ifdefs でラップすることが、私がそれを行う方法だと思います。

于 2009-01-08T03:10:24.797 に答える
1

継続的インテグレーション サーバーで実行されているコンソール ツールに対して行う方法は次のとおりです。

private static void Main(string[] args)
{
  var parameters = CommandLineUtil.ParseCommandString(args);

#if DEBUG
  RunInDebugMode(parameters);
#else
  RunInReleaseMode(parameters);
#endif
}


static void RunInDebugMode(IDictionary<string,string> args)
{
  var counter = new ExceptionCounters();
  SetupDebugParameters(args);
  RunContainer(args, counter, ConsoleLog.Instance);
}

static void RunInReleaseMode(IDictionary<string,string> args)
{
  var counter = new ExceptionCounters();
  try
  {
    RunContainer(args, counter, NullLog.Instance);
  }
  catch (Exception ex)
  {
    var exception = new InvalidOperationException("Unhandled exception", ex);
    counter.Add(exception);
    Environment.ExitCode = 1;
  }
  finally
  {
    SaveExceptionLog(parameters, counter);
  }
}

基本的に、リリース モードでは、未処理の例外をすべてトラップし、それらをグローバル例外カウンターに追加し、ファイルに保存してからエラー コードで終了します。

デバッグでは、より多くの例外がスローされた場所に送られます。さらに、デフォルトでコンソール ロガーを使用して、何が起こっているかを確認します。

PS: ExceptionCounters、ConsoleLog などはLokad 共有ライブラリから取得されます

于 2009-01-08T05:27:22.820 に答える
1

「すべての例外で中断する」オプションがあります。使用しているVSのバージョンはわかりませんが、VS 2008ではCtrl + D、Eを押すことができます。次に、ブレークしたい例外の種類のチェックボックスThrownチェックボックスをクリックできます

VSの以前のバージョンには、「すべての例外で中断」という効果のあるデバッグメニュー項目があったと思います。残念ながら、私は以前のバージョンを手元に持っていません。

于 2009-01-08T04:22:57.070 に答える