Подтвердить что ты не робот

Можно ли игнорировать некоторые исключения на определенных строках в Visual Studio?

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

Я реорганизую такие вещи, где могу, но много раз это слишком дорого для рефакторинга для небольшого выигрыша. Эти фиктивные исключения становятся крайне раздражающими при отладке. Мы улавливаем все исключения, чтобы избежать сбоев в работе нашей программы, и улавливаем большинство исключений и отображаем что-то более удобное для пользователя. Таким образом, при отладке, если какой-то фрагмент кода генерирует ApplicationException, может быть 50 исключений этого типа, которые будут выброшены, прежде чем мы, наконец, перейдем к фактической ошибке. В большинстве случаев эти фиктивные исключения сфокусированы вокруг одной части кода (много раз одна строка). Можно ли каким-либо образом заставить Visual Studio игнорировать исключения, выведенные из этой строки, но все же остановиться на исключении, которое является реальной проблемой? Или есть что-то еще, что я могу сделать, чтобы предотвратить такое отладочное разочарование?

Чтобы проиллюстрировать мою проблему, представьте себе что-то вроде этого:

for(int i=0; i<foo; i++)
{
  try
  {
    FooBar(i); //this function throws NullReferenceException sometimes
  }catch {} //ignore it because we don't care if it failed
}
....
var tmp=Bar as FooType; //this cast fails so tmp is null
tmp.Meh(); //throws exception here. This is a bug, we should've checked for null

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

4b9b3361

Ответ 2

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

Если возможно, вы можете поместить (части) унаследованного кода в отдельные сборки. Скомпилируйте те с оптимизацией и включите "Только мой код" отладки.

Для небольших блоков (Методы) вы можете использовать атрибут DebuggerStepThrough, поэтому debbuger там не сломается. Для вашего примера вы можете создать метод, который перестраивает цикл, который вызывает ваш метод FooBar и помещает [DebuggerStepThrough] в новый созданный метод. Альтернативно вы можете реорганизовать FooBar для обработки исключения и поместить на него [DebuggerStepThrough].

Ответ 3

Я разрабатываю IntelliDebugger - расширение для Visual Studio, что облегчает отладку кода С++/С#. Включая работу с исключениями. IntelliDebugger может фильтровать исключения, которые были выброшены из модулей, не включены в решение (эта функция называется "Исключение прерываний только из решения" ). Возможно, эта функция вам будет полезна.

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