Я могу позволить/запретить повредиться на Исключениях программно?

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

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

11
задан Cœur 14 November 2019 в 03:43
поделиться

4 ответа

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

3
ответ дан 3 December 2019 в 09:19
поделиться

Вы также можете использовать утверждения вместо точек останова. Например, если вы хотите установить точку останова только на 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 равен false, цикл будет выполняться без ассертов, при втором вызове цикл будет прерван.

0
ответ дан 3 December 2019 в 09:19
поделиться

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

При отладке программы я часто включаю функцию First Chance Exceptions (Debug -> Exceptions) для отладки приложения. Если происходит много исключений, очень трудно найти, где что-то пошло "не так".

Кроме того, это приводит к некоторым анти-паттернам, таким как печально известный "catch throw", и скрывает реальные проблемы. Более подробную информацию об этом можно найти в статье в блоге, которую я сделал на эту тему.

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

1
ответ дан 3 December 2019 в 09:19
поделиться

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

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

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

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

        try
        {
            //code
        }
        catch (FileNotFoundException e)
        {
            //Normal Code here
            #if DEBUG
            //More Detail here
            #endif
        }
        #if DEBUG
        catch (Exception e)
        {
            //handel other exceptions here
        }
        #endif
1
ответ дан 3 December 2019 в 09:19
поделиться