忽略C#命令行程序中的try块

时间:2009-01-08 03:05:48

标签: c# visual-studio-2008 command-line console

我在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 个答案:

答案 0 :(得分:8)

您可以在VS中开启First chance exceptions。这将允许您在提出异常时立即得到通知。

答案 1 :(得分:4)

我认为将VS设置为break on uncaught exceptions并在ifdefs中包装try / catch是我将如何去做。

答案 2 :(得分:1)

有一个“打破所有例外”的选项。我不确定你使用的是什么版本的VS但是在VS 2008中你可以按Ctrl + D,E。然后你可以点击你想要打破的例外类型的Thrown复选框复选框

我相信VS的早期版本中有一个Debug菜单项,其效果为“Break on all exceptions”。不幸的是,我没有以前的版本。

答案 3 :(得分: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 Shared Libraries