3

我有一个 C# 命令行程序,我用 try-catch 块包装了它,以防止它崩溃控制台。但是,当我调试它时,如果在 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

有一个“打破所有例外”的选项。我不确定您使用的是哪个版本的 VS,但在 VS 2008 中,您可以按 Ctrl + D、E。然后您可以单击复选框“抛出”复选框,了解您想要中断的异常类型

我相信在以前版本的 VS 中有一个 Debug 菜单项,其效果是“中断所有异常”。不幸的是,我手头没有以前的版本。

于 2009-01-08T04:22:57.070 回答
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 回答