Visual Studio: Як зламати оброблювані винятки?


165

Я хотів би, щоб Visual Studio зламався, коли трапляється виняток, що обробляється (тобто я не просто хочу бачити повідомлення "Перший шанс", я хочу налагодити фактичний виняток).

наприклад, я хочу, щоб налагоджувач перервався за винятком:

try
{
   System.IO.File.Delete(someFilename);
}
catch (Exception)
{
   //we really don't care at runtime if the file couldn't be deleted
}

Я натрапив на ці замітки для Visual Studio.NET:

1) У VS.NET перейдіть до меню налагодження >> "Винятки ..." >> "Винятки з загальної мови виконання" >> "Система" та виберіть "System.NullReferenceException"

2) У нижній частині цього діалогового вікна розміщено вікно групи "Коли буде викинуто виняток:", виберіть "Пробитися до налагоджувача"

3) Запустіть свій сценарій. Коли буде викинуто виняток, налагоджувач зупиниться та сповістить вас у діалоговому вікні, в якому написано щось на зразок: "Виняток типу" System.NullReferenceException "було викинуто. [Перерва] [Продовжити]"

Удар [Перерва]. Це поставить вас на рядок коду, який викликає проблему.

Але вони не застосовуються до Visual Studio 2005 ( у меню « Налагодження » немає опції « Винятки »).

Хтось знає, де знайти діалогове вікно параметрів у Visual Studio, що групове поле " Коли викид буде викинуто ", з опцією " Пробитися до налагоджувача "?

Оновлення. Проблема полягала в тому, що в моєму меню налагодження не було пункту Винятки . Я налаштував меню, щоб додати його вручну.


9
У VS2015 він знаходився під налагодженням -> Windows-> Налаштування
винятку

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

Відповіді:


170

З рішенням, відкритим, перейдіть до меню Налагодження - Винятки ( Ctrl+ D, E). Звідти ви можете вийти з виключень Thrown або User-unhandled .

EDIT: Мій екземпляр налаштований на C # "профіль", можливо, його немає для інших профілів?


10
у мене просто немає такого варіанту. Це пояснило б мою розгубленість.
Ян Бойд

58
У мене було меню налагодження, але немає варіантів винятків. я налаштував меню, щоб додати його вручну; клавіша швидкого доступу працювала в будь-якому випадку (Ctrl + Alt + E)
Ян Бойд,

3
Крім того, ви можете скинути середовище VS2010, перейшовши в "Інструменти", "Імпортувати параметри експорту" та вибрати скидання до середовища C # ... воно містить пункт підменю "Виключення".
підменю "

14
Я вибрав Common Language Runtime Exceptions> <All Common Language Runtime Exceptions not in this list>під Visual Studio 2017 і всі мої найсміливіші мрії здійснилися.
Аарон Ньютон

9
Visual Studio 2015: Налагодження -> Windows -> Налаштування винятків
achecopar

47

У VS2005 є вікно "винятки" ... спробуйте Ctrl + Alt+ Eпід час налагодження та натисніть прапорець "Викинуто" для виключення, на якому ви хочете зупинитись.


Саме цього я хочу. Де це в меню? За життя мене я не можу його знайти.
Ян Бойд

Комбінація клавіш може змінюватися відповідно до профілю (розробник C #, розробник C ++ тощо)
Asaf R

1
У мене є пункт меню: Налагодження -> Винятки. Це з VS2005 Professional. У вас працює видання Express?
Роб Уокер

5
якщо ви хочете пункт меню Винятки: Виберіть Інструменти | Налаштувати .... Перейдіть на вкладку Команди. Виберіть категорію налагодження у полі Категорії. Знайдіть елемент команди «Винятки ...», потім перетягніть його до меню «Налагодження» у верхній частині програми, опустивши його у відповідне місце в меню. (знайдено в коментарях до: blogs.vertigo.com/personal/keithc/Blog/archive/2007/07/20/… )
sotto

33

Зайняв час, щоб знайти нове місце для налаштувань очікування, тому нова відповідь.

З Visual Studio 2015 ви керуєте, на яких винятках зупинятись у вікні налаштувань винятку (Debug-> Windows-> Settings Exception). Ярлик все ще Ctrl- Alt- E.

Найпростіший спосіб обробляти спеціальні винятки - це вибрати "всі винятки, що не в цьому списку".

Ось скріншот з англійської версії:

введіть тут опис зображення

Ось скріншот з німецької версії:

введіть тут опис зображення


16

Від Visual Studio 2015 і далі вам потрібно перейти до діалогового вікна "Налаштування винятку " ( Ctrl+ Alt+ E) і вимкнути "Винятки з загальної мови для виконання часу" (або конкретну, яку ви хочете, тобто ArgumentNullException), щоб зробити її розбитою на оброблювані винятки.

Крок 1 Крок 1 Крок 2 Крок 2


8

Перевірте Управління винятками на сторінці «Відладчик» , і пояснюється, як це налаштувати.

По суті, ось такі кроки (під час налагодження):

  1. У меню Налагодження натисніть Винятки.

  2. У діалоговому вікні "Винятки" виберіть Thrown для цілої категорії винятків, наприклад, Винятки з загальної мови виконання.

    або

    Розгорніть вузол на категорію винятків, наприклад, Винятки із загальної мови виконання. Виберіть Thrown для конкретного винятку в межах цієї категорії.


1

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

if(!GlobalTestingBool)
{
   try
   {
      SomeErrorProneMethod();
   }
   catch (...)
   {
      // ... Error handling ...
   }
}
else
{
   SomeErrorProneMethod();
}

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


3
Це корисна методика - вона перетворює оброблювану виняток у незроблений виняток, тому налагоджувач зупиняється на ній автоматично. Я не впевнений, чому це було знято, якщо тільки не було того, що не існує хорошого способу встановити ваш GlobalTestingBool. Ще один, можливо, кращий варіант - використовувати Debugger.IsAttached.
Джо Вайт

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

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

я знаю, що це справді стара відповідь, але для випадкових гуглерів, як я, ви можете просто додати catch(){/*handle or not*/ throw; } // throw without any exception specified will rethrow original exception with original callstack etc
Jan 'splite' K.

0

Інтернет-документація здається трохи незрозумілою, тому я просто провів невеликий тест. Якщо вибрати діалогове вікно «Виключення», перервати функцію «Thrown», це призведе до того, що виконання програми перерветься на будь-який виняток, оброблюваний чи оброблений. Якщо ви хочете перешкоджати лише оброблюваним виняткам, вам здається, що ваш єдиний прийом - це пройти свій код і поставити точки перерви на всі ваші винятки, що обробляються. Це здається трохи надмірним, тому, можливо, буде краще додавати заяву про налагодження щоразу, коли ви обробляєте виняток. Тоді, побачивши цей вихід, ви можете встановити точку розриву в цьому рядку в коді.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.