Можно ли полностью игнорировать блок catch при отладке? - PullRequest
9 голосов
/ 11 июля 2011

Я работаю в WinForms (.net 3.5) и имею следующую строку кода:

     HitTestResult result;
     try
     {
        result = this.HitTest( e.X, e.Y, ChartElementType.DataPoint);
     }
     catch(Exception e)
     {
        //This happens, we don't care!
     }

Я не контролирую, генерирует ли HitTest исключение, но если это так, мне абсолютно все равно.

Можно ли отключить остановку моей IDE на этом конкретном блоке перехвата? Я понимаю, что могу отключить System.FormatException, которое он может генерировать (из меню Debug-> Exceptions, но это своего рода излишество.

Спасибо!

Ответы [ 7 ]

16 голосов
/ 11 июля 2011

Вы можете использовать атрибут DebbugerStepThrough , чтобы пропустить эту строку. Из MSDN:

Указывает отладчику пошагово выполнять код, а не переходить в код.

Например:

[DebuggerStepThrough]
public void MyMethod()
{
    HitTestResult result;
    try
    {
        result = this.HitTest(e.X, e.Y, ChartElementType.DataPoint);
    }
    catch (Exception e)
    {
        //This happens, we don't care!
    }
}
10 голосов
/ 11 июля 2011

Если вы выделите свой код в отдельный метод, вы можете украсить его с помощью DebuggerStepThrough, и среда IDE не остановится:

[DebuggerStepThrough]
public void SomeMethod()
{
    HitTestResult result;
    try
    {
        result = this.HitTest(e.X, e.Y, ChartElementType.DataPoint);
    }
    catch (Exception e)
    {
        //This happens, we don't care!
    }
}
6 голосов
/ 11 июля 2011

Вы можете поместить блок try / catch в его собственный метод и украсить этот метод любым из следующих атрибутов:

DebuggerStepThrough - заставляет отладчик перешагнуть метод

DebuggerHidden - скрывает метод от отладчика (даже не разрешает точки останова)

DebuggerNonUserCode - комбинация двух предыдущих

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

Посмотрите, может ли DebuggerNonUserCodeAttribute помочь вам.

1 голос
/ 11 июля 2011

Попробуй,

 HitTestResult result;
 try
 {
    result = this.HitTest( e.X, e.Y, ChartElementType.DataPoint);
 }
 catch(Exception e)
 {       
    if(!Debugger.IsAttached)
    {
        //This happens, we don't care!
    }
 }
0 голосов
/ 11 июля 2011

Я понимаю, что вы хотите разбить все исключения , кроме , но VS не предлагает эту опцию.

Я бы порекомендовал переписать метод HitTest (), чтобы он корректно обрабатывал сбои, а не разрешал генерировать исключения, например, путем проверки входных параметров.

Исправление: 0A0D ответ показывает, что это возможно, и это будет лучше всего работать с вызовами API или другим кодом, который вы не можете контролировать. Но когда вы это сделаете, вам следует подумать о том, чтобы переписать его, чтобы корректно обрабатывать ошибки.

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

Почему бы не сделать следующее?

 HitTestResult result;
 try
 {
    result = this.HitTest( e.X, e.Y, ChartElementType.DataPoint);
 }
 catch(Exception e)
 {
 #if !DEBUG
    //This happens, we don't care!
 #endif
 }  
...