Не останавливайте отладчик в THAT-исключении, когда он бросает и поймает

В инструментах/исключениях я установил параметр, который отладчик останавливает, когда генерируется исключение. Будет ли это пойман или нет.

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

Пример: я хочу проигнорировать исключение нулевой ссылки (которое поймано) в строке 344. Я хочу остановиться на всех других исключениях

Ответ 1

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

Ответ 2

DebuggerHidden - ваш друг!

Общая среда выполнения языка не связывает этот атрибут с семантикой. Он предоставляется для использования отладчиками исходного кода. Например, отладчик Visual Studio 2005 не останавливается в методе, отмеченном этим атрибутом, и не позволяет установить точку останова в методе. Другие атрибуты отладчика, распознаваемые отладчиком Visual Studio 2005, являются атрибутом DebuggerNonUserCodeAttribute и DebuggerStepThroughAttribute.

Протестировано на VS2010 и отлично работает.

Хотя DebuggerStepThrough, похоже, также работает для некоторых конкретных версий отладчика, DebuggerHidden, похоже, работает для более широкого круга ситуаций, основанных на комментариях к обоим ответам.

Обратите внимание, что оба варианта в настоящее время не работают с методами блока итератора или для методов async/await. Это может быть исправлено в более позднем обновлении Visual Studio.

Ответ 3

DebuggerStepThrough - это тот, который будет использоваться, чтобы предотвратить отладчик, чтобы он разбился на метод, где есть try/catch.

Но это работает, только если вы не сняли флажок "Включить только мой код (только управляемый)" в общих настройках параметров отладки Visual Studio (меню "Инструменты/Параметры", node "Отладка/Общие" )..

Дополнительная информация об этом атрибуте http://abhijitjana.net/2010/09/22/tips-on-debugging-using-debuggerstepthrough-attribute/

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

Ответ 4

Атрибуты, указанные в других ответах (и другие, такие как атрибут DebuggerNonUserCode), по-прежнему не работают аналогично по умолчанию в Visual Studio 2015. Отладчик будет прерывать исключения на рынке методов с этими атрибутами, в отличие от более старые версии VS. Чтобы отключить повышение производительности, которое изменило их поведение, вам необходимо изменить настройку реестра:

reg add HKCU\Software\Microsoft\VisualStudio\14.0_Config\Debugger\Engine /v AlwaysEnableExceptionCallbacksOutsideMyCode /t REG_DWORD /d 1

Дополнительную информацию можно найти в блоге визуальной студии.

(Вероятно, это должен быть комментарий к верхнему ответу, но мне не хватает rep)

Ответ 5

Вы не можете выделить исключение, созданное в определенном месте вашего кода. Однако вы можете отключить исключения определенного типа.

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

Отключение системных исключений, таких как NullReferenceException, повлияет на всю систему, что, конечно же, не желательно во время разработки.

Обратите внимание, что для исключений существует два типа разломов:

  • Выброшено: если выбрано, ломается, как только будет выбрано исключение этого типа
  • User-unhandled: если выбрано, ломается, только если исключение этого типа не обрабатывается try/catch.

Вы можете удалить чек в "Брошенный" для исключения NullReferenceException, который даст вам преимущество не прерывать каждый раз, когда ваша система передает указанную строку в вашем коде, но все еще ломается, если у вас есть необработанное завершение NullReference, возникающее в других частей системы.