Если я добавлю блок try-catch с помощью только Debugger.Break () в catch - PullRequest
2 голосов
/ 22 июля 2011

... будет ли он фактически пустым try-catch в сборке релиза?

Или это никогда не дойдет до сборки?

try
{
   // do stuff...
   // do stuff...
}
catch
{
    Debugger.Break();
}

Я знаю, что вызовы отладчика не будут включены - очевидно, но относится ли это к catch Я тоже обернул его?

И это плохо? Это просто для целей отладки - я хочу видеть исключение именно там, где оно произошло, а не там, где оно меня покидает после того, как оно лопнет в стеке. Это просто удобнее.

Ответы [ 4 ]

5 голосов
/ 22 июля 2011

Не является ответом непосредственно на ваш вопрос, но знаете ли вы, что Visual Studio имеет встроенные возможности прерывания напрямую при возникновении исключения?

Функциональность можно найти в разделе Отладка-> Исключения (или Ctrl +Alt + E)

Подробнее на http://stevesmithblog.com/blog/visual-studio-break-when-exception-thrown/.

2 голосов
/ 22 июля 2011

Это приведет к пустому блоку catch.Чтобы избежать этого, вы можете использовать условные последовательности компиляции:

private void DoSomething()
{
#if DEBUG
    try
    {
#endif
        //do something
#if DEBUG
    }
    catch
    {
        Debugger.Break();
        throw;
    }
#endif
}
1 голос
/ 22 июля 2011

Если вы сделаете это, он выйдет из строя в режиме отладки и просто проигнорирует перехваченные исключения в режиме выпуска.Это в точности эквивалентно просто установлению точки останова на улове, которая исчезает в режиме релиза.Так же, как пустой блок catch в режиме релиза.

0 голосов
/ 22 июля 2011

Или вы можете предпочесть эту версию:

private void DoSomething() 
{ 
  try     
  { 
    //do something 
  }     
  catch     
  {
#if DEBUG
    Debugger.Break();
#else
    throw;  // throws the exception using original call stack.
#endif
  }
} 
...