Не зупиняйте налагоджувач на ТОМ виключенні, коли його кидають і ловлять


91

В інструментах / винятках я встановив параметр, що налагоджувач зупиняється, коли створюється виняток. Незалежно від того, спійманий він чи ні.

Як виключити виняток із цього правила? Десь у моєму коді є спійманий виняток, який є частиною логіки програми. Тому я, очевидно, не хочу, щоб цей виняток зупиняв налагоджувач кожного разу, коли він потрапляє.

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


6
Коли цей виняток є частиною вашої логіки програмування (подумайте, якщо вам дійсно доведеться реалізовувати його таким чином) - тоді він повинен бути принаймні створеним власноруч, похідним винятком. Таким чином можна застосувати розчин Брайана.
tanascius


2
@tanascius - +1 Я згоден у більшості випадків Винятки - не найкращий спосіб прийняти логічне рішення; однак у деяких випадках, наприклад, коли десериалізація винятків обробки іноді неминуча, тому throw> catch> handle є єдиним розумним варіантом.
jpierson 07

2
@Ando вибачте, моє погане. Модерувати кілька вкладок одночасно ефективно, але не завжди точно.

2
@tanascius: можливо, вам все одно доведеться зловити відомий виняток фреймворку, перш ніж ви зможете кинути свій власний у відповідь. Ваша пропозиція не завжди можлива.
Ден Пузей

Відповіді:


40

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


31
Відповідно до відповіді malinger та мого досвіду, ця відповідь виявляється неправильною. DebuggerStepThroughАтрибут не впливає на поведінку відладчика з першим шансом винятком.
Michael Petrotta

5
@Tim, я тестував, і це НЕ зупиняється. перевірка моєї відповіді: stackoverflow.com/questions/1420390/3455100#3455100
шіммі Weitzhandler

1
+1 працює у VS2010 для чистого коду .NET 4.0 та Silverlight 4 для необроблених винятків.
Mike Post

6
Важлива примітка: Це не працює для методів типу async-await. Більше тут
i3arnon

8
Згідно з MSDN, DebuggerStepThroughатрибут не має значення для CLR. Він інтерпретується налагоджувачами. Здається, це не працює надійно за різних обставин, і це DebuggerHiddenбуде працювати надійно stackoverflow.com/a/3455100/141172
Ерік Дж.

64

DebuggerHidden це твій друг!

Загальномовна середовище виконання не додає до цього атрибуту ніякої семантики. Він надається для використання налагоджувачами вихідного коду. Наприклад, налагоджувач Visual Studio 2005 не зупиняється в методі, позначеному цим атрибутом, і не дозволяє встановлювати точку зупинки в методі. Іншими атрибутами налагоджувача, розпізнаними налагоджувачем Visual Studio 2005, є DebuggerNonUserCodeAttribute та DebuggerStepThroughAttribute.

Перевірено на VS2010 і чудово працює.

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

Зауважте, що обидва варіанти наразі не працюють з методами блоку ітераторів або з методами async / await . Це може бути виправлено в пізнішому оновленні Visual Studio.


працює над VS2008. Ви повинні застосувати його до всього методу, включаючи блок catch, або ви просто зламаєте десь ще
Mark Heath

1
Я додав цей атрибут до методу, і натомість налагоджувач просто зупинився на його виклику. Мені чогось не вистачає?
Doogal,

1
Ось так повинно бути. щоб цього уникнути, вам доведеться обробляти виняток ... Або ж позначити також метод абонента DebuggerHidden...
Shimmy Weitzhandler

1
Зверніть увагу, що атрибута DebuggerStepThrough має бути достатньо, щоб уникнути порушення на винятках. DebuggerHidden діє як комбінація як DebuggerNonUserCode, так і DebuggerStepThrough Attribute.
jpierson


14

DebuggerStepThrough - це той, який буде використаний для запобігання злому налагоджувачем у методі, де є спроба / зловити.

Але це працює, лише якщо ви не зняли прапорець "Увімкнути лише мій код (лише керований)" у загальних налаштуваннях параметрів налагодження Visual Studio (меню Інструменти / Параметри, налагодження вузла / Загальне) ...

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

DebuggerHidden просто заважатиме налагоджувачу відображати метод, де викидається виняток. Натомість він покаже перший метод у стеку, який не позначений цим атрибутом ...


1
Зверніть увагу, що це більше не працює за замовчуванням у VS 2015, див. Блог VS про те, як його увімкнути
bhh

На жаль, обхід VS 2015 не працює для VS 2019.
Джонатан Аллен

13

Атрибути, зазначені в інших відповідях (та інших, таких як DebuggerNonUserCodeатрибут), більше не працюють однаково за замовчуванням у Visual Studio 2015. Налагоджувач порушить винятки в методах ринку з цими атрибутами, на відміну від старих версій VS. Щоб вимкнути підвищення продуктивності, яке змінило їх поведінку, потрібно змінити параметри реєстру:

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

Більше інформації можна знайти в блозі візуальної студії .

(Це, мабуть, повинен бути коментарем до верхньої відповіді, але у мене недостатньо представників)


3

Ви не можете виділити виняток, який було створено у певному місці вашого коду. Тим не менш, ви можете відключити виключення певного типу.

Якщо ваш власний код кидає виняток, про який йде мова, я б зробив це спеціальним винятком, похідним від того, що підходить, а потім відключив порушення налагодження для цього похідного типу.

Вимкнення системних винятків як NullReferenceException вплине на всю систему, що, звичайно, не бажано під час розробки.

Зверніть увагу, що для винятків існує два типи порушення поведінки:

  • Кинуто: якщо вибрано, розриви, як тільки буде вилучено виняток цього типу
  • Не обробляється користувачем: якщо вибрано, розбиває лише в тому випадку, якщо виняток цього типу не обробляється методом try / catch.

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


3
Додавання атрибута DebuggerStepThrough до методу у Visual Studio 2010 перешкоджатиме відладчику зупиняти не обробляється виняток, викликаний методом.
Тім Мерфі

Я тестував, і це не заважає; воно все ще зупиняється
Shimmy Weitzhandler

1
@Shimmy - працює для мене! Переконайтеся, що ви застосовуєте DebuggerStepThrough до кожного методу від точки, до якої він кинутий, до точки, для якої ви хочете, щоб виняток став видимим у стеці викликів. Якщо ви вловите виняток і обробляєте його в ієрархії викликів, де всі методи прикрашені DebuggerStepThrough, ви ніколи не побачите переривання VS для цього винятку.
jpierson
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.