Могу ли я включить/отключить прерывание Исключения программно?

Я хочу, чтобы иметь возможность прерывать Исключения при отладке... как в Visual Studio 2008 Меню "Диалог отладки/исключения", за исключением того, что моя программа имеет много допустимых исключений, прежде чем я получу бит, который я хочу отлаживать.

Поэтому вместо того, чтобы вручную включать и отключать его с помощью диалога каждый раз, возможно ли это сделать автоматически с помощью #pragma или какого-либо другого метода, так что это происходит только в определенной части кода?

Ответ 1

Единственный способ сделать что-то близкое к этому - поместить в свой метод параметр DebuggerNonUserCodeAttribute.

Это гарантирует, что любые исключения в отмеченном методе не вызовут прерывания исключения.

Хорошее объяснение этого здесь...

Это атрибут, который вы указали против метода, чтобы сообщить отладчику "Ничего общего со мной guv". Не мой код! ". Отвратительный отладчик поверит вам и не будет нарушать этот метод: использование этого атрибута позволяет отладчику вообще пропустить этот метод, даже когда вы переходите через код; исключения, которые происходят, и затем попадают в этот метод, не будут входить в отладчик. Он будет обрабатывать его так, как если бы это был вызов сборки Framework, и если исключение будет обработано без ошибок, оно будет сообщено на один уровень выше стека вызовов в коде, который называется методом.

Пример кода:

public class Foo
{
    [DebuggerNonUserCode]
    public void MethodThatThrowsException()
    {
        ...
    {
}

Ответ 2

Как насчет условных точек останова? Если я правильно понимаю, вы можете иметь огонь точки останова только тогда, когда значение определенной переменной или выражения истинно.

Ответ 3

Оберните блоки захвата try в #if DEBUG

    public void Foo()
    {
        #if DEBUG
        try
        #endif
        {
            //Code goes here
        }
        #if DEBUG
        catch (Exception e)
        {
            //Execption code here
        }
        #endif
    }

Мне нравится держать фигурные скобки за пределами #if таким образом, чтобы он сохранял код в той же области действия, если внутри или вне отладки.

Если вы все еще хотите обработать execption, но хотите больше деталей, вы можете это сделать

        try
        {
            //code
        }
        catch (FileNotFoundException e)
        {
            //Normal Code here
            #if DEBUG
            //More Detail here
            #endif
        }
        #if DEBUG
        catch (Exception e)
        {
            //handel other exceptions here
        }
        #endif

Ответ 4

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

При отладке программы я часто переворачиваю "Исключения первого шанса" ( "Отладка → Исключения" ) для отладки приложения. Если существует множество исключений, очень трудно найти, где что-то пошло "неправильно".

Кроме того, это приводит к некоторым анти-шаблонам, таким как печально известный "catch catch" и обфускации реальных проблем. Для получения дополнительной информации см. Сообщение в блоге, которое я сделал по этому вопросу.

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

Ответ 5

Вы также можете использовать утверждения вместо контрольных точек. Например, если вы хотите только точку останова на 5-й итерации цикла во второй раз, когда вы вызываете эту функцию, вы можете сделать:

bool breakLoop = false;

...
    Work(); // Will not break on 5th iteration.
    breakLoop = true;
    Work(); // Will break on 5th iteration.
...

public void Work() {
    for(int i=0 ; i < 10 ; i++) {
        Debug.Assert (!(breakLoop && i == 5));
        ...
    }
}

Итак, в первом вызове Work, в то время как breakLoop является ложным, цикл будет работать без утверждения, второй раз через цикл будет ломаться.