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 ». [Break] [Continue]»

Хит [Перерыв]. Это поместит вас в строку кода, которая вызывает проблему.

Но они не относятся к Visual Studio 2005 ( в меню « Отладка» нет опции « Исключения» ).

Кто-нибудь знает, где находится диалоговое окно «Найти эти параметры» в Visual Studio, в котором находится групповое поле « Когда выбрасывается исключение » с параметром « Взлом в отладчик »?

Обновление: проблема заключалась в том, что в моем меню отладки не было элемента « Исключения» . Я настроил меню, чтобы добавить его вручную.


9
В VS2015 это было под Debug-> Windows-> Настройки исключений
PeterVermont

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

Ответы:


170

Открыв решение, перейдите в меню «Отладка - Исключения ( Ctrl+ D, E)». Оттуда вы можете выбрать для исключения Throw или необработанного пользователем .

РЕДАКТИРОВАТЬ: мой экземпляр настроен с "профилем" 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 Edition?
Роб Уокер

5
если вы хотите пункт меню Исключения: Выберите Инструменты | Настроить .... Нажмите на вкладку Команды. Выберите категорию «Отладка» в поле «Категории». Найдите пункт «Исключения ...» и перетащите его в меню «Отладка» в верхней части приложения, поместив его в соответствующее место в меню. (найдено в комментариях: blogs.vertigo.com/personal/keithc/Blog/archive/2007/07/20/... )
Сотто

33

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

Начиная с Visual Studio 2015, вы управляете тем, какие исключения следует включать в окне настроек исключений (Debug-> Windows-> Exception Settings). Ярлык все еще Ctrl- Alt- E.

Самый простой способ обработки пользовательских исключений - выбрать «все исключения, отсутствующие в этом списке».

Вот скриншот из английской версии:

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

Вот скриншот с немецкой версии:

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


16

Начиная с Visual Studio 2015 и далее, вам нужно перейти в диалоговое окно «Настройки исключений» ( Ctrl+ Alt+ E) и отметить «Общие исключения времени выполнения языка» (или конкретное, которое вы хотите, т. Е. ArgumentNullException), Чтобы оно разрывалось на обработанные исключения.

Шаг 1 Шаг 1 Шаг 2 Шаг 2


8

Проверьте страницу « Управление исключениями» на странице « Отладчик» , в которой объясняется, как это настроить.

По сути, вот шаги (во время отладки):

  1. В меню «Отладка» выберите «Исключения».

  2. В диалоговом окне «Исключения» выберите «Брошенные» для всей категории исключений, например, «Исключения времени выполнения общего языка».

    -или-

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


1

Техника, которую я использую, похожа на следующую. Определите глобальную переменную, которую вы можете использовать для одного или нескольких блоков try catch, в зависимости от того, что вы пытаетесь отлаживать, и используйте следующую структуру:

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
Ян 'сплит' К.

0

Электронная документация кажется немного неясной, поэтому я просто провел небольшой тест. Выбор прерывания на Thrown в диалоговом окне «Исключения» приводит к прерыванию выполнения программы для любого исключения, обработанного или необработанного. Если вы хотите разбить только обработанные исключения, кажется, что единственным выходом для вас является прохождение кода и установка точек останова на все обработанные исключения. Это кажется немного чрезмерным, поэтому может быть лучше добавить оператор отладки всякий раз, когда вы обрабатываете исключение. Затем, когда вы видите этот вывод, вы можете установить точку останова в этой строке кода.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.