Я хочу смочь повредиться на Исключениях при отладке... как в Меню 2008 Visual Studio Диалоговое окно, Debug/Exception, кроме моей программы имеет много допустимых исключений, прежде чем я доберусь до бита, который я хочу отладить.
Таким образом вместо того, чтобы вручную включить и отключить его с помощью диалогового окна каждый раз - он возможный сделать это автоматически с #pragma или некоторым другим методом, таким образом, это только происходит в определенной части кода?
А как насчет условные точки останова ? Если я правильно понимаю, у вас может быть срабатывание точки останова только тогда, когда значение определенной переменной или выражения истинно.
Вы также можете использовать утверждения вместо точек останова. Например, если вы хотите установить точку останова только на 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, цикл будет выполняться без ассертов, при втором вызове цикл будет прерван.
Это немного поздновато для вас, но это главная причина, по которой я часто пытаюсь научить людей использовать исключения консервативно. Используйте исключения только тогда, когда произошло что-то катастрофическое, и ваша способность разумно продолжать работу исчезла.
При отладке программы я часто включаю функцию First Chance Exceptions (Debug -> Exceptions) для отладки приложения. Если происходит много исключений, очень трудно найти, где что-то пошло "не так".
Кроме того, это приводит к некоторым анти-паттернам, таким как печально известный "catch throw", и скрывает реальные проблемы. Более подробную информацию об этом можно найти в статье в блоге, которую я сделал на эту тему.
Что касается вашей проблемы, вы можете включить отладку по первому шансу только для определенного типа исключений. Это должно работать хорошо, если только другие исключения не относятся к тому же типу.
Оберните ваши блоки 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