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

Visual Studio 2015 прерывает необработанные исключения, не работающие

В Visual Studio используется специальный флажок "Break on Un-Handled exception". В 2015 году это было удалено (или перемещено где-то, я не могу его найти). Итак, теперь мои преобразованные проекты больше не ломаются, если я не могу предоставить обработчик исключений на уровне пользователя. Я не хочу ломать все "заброшенные исключения", потому что я обрабатываю конкретные. Только там, где я не могу предоставить конкретный обработчик.

В настоящее время мой код просто выходит из текущей процедуры и продолжает выполнение в следующей ячейке стека вызовов, НЕ ХОРОШО.

Кто-нибудь знает, как вернуть это в Visual Studio 2015? Вчера я обновился до сообщества.

4b9b3361

Ответ 1

Появится новое окно "Параметры исключения", которое появляется в нижней правой панели по умолчанию при начале отладки. В нем есть все варианты, которые вы ожидаете.

Вы можете вызвать его с помощью CTRL + ALT + E

Это позволяет вам выбирать, какие исключения вызывают перерыв в отладчике.

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

Вам нужно будет сначала проверить "Включить только мой код" в меню "Сервис" > "Параметры" > "Отладка".

Затем вы можете щелкнуть правой кнопкой мыши заголовок столбца (Break When Thrown) в новом окне "Настройки исключений" и добавить столбец "Дополнительные действия", который затем позволяет установить каждое исключение как "Продолжить, когда необработанный пользователь код".

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

Подробнее об этом здесь:

http://blogs.msdn.com/b/visualstudioalm/archive/2015/02/23/the-new-exception-settings-window-in-visual-studio-2015.aspx

Ответ 2

У меня была такая же проблема, и мне удалось это решить, сделав это -

  • Нажмите Ctrl + Alt + e, чтобы открыть в окне "Настройки исключения".
  • Отметьте Исключения для обычного языка Runtime. введите описание изображения здесь

Что это!

Я был вдохновлен этой post, так как я использую x64 версию Windows.

Ответ 3

Microsoft тонко изменила логику в новом окне исключений.

См. http://blogs.msdn.com/b/visualstudioalm/archive/2015/02/23/the-new-exception-settings-window-in-visual-studio-2015.aspx

Ключевой частью является:

Важные примечания

  • Это новое окно содержит все те же функции, что и старый модальный диалог. Никакие возможности отладчика не изменились только так, как вы можете получить к ним доступ.
  • Отладчик всегда будет ломаться, если исключение не обработано
  • Параметр, который нужно изменить, если отладчик разбивается на пользовательские исключения, перемещен в контекстном меню
  • Расположение меню переместилось в Debug → Windows → Настройки исключения

Однако, если у меня в вашем коде есть глобальный обработчик исключенных обработок, тогда второй элемент в этом списке является ключевым: для меня никакие исключения, следовательно, не будут действительно необработанными, что, кажется, отличается от VS2013.

Чтобы вернуться к поведению, когда VS разбивается на необработанные исключения, мне пришлось отмечать все типы исключений, которые я хотел разбить, а затем, во-вторых, убедиться, что "Дополнительные параметры" (возможно, вам понадобится сделать этот столбец видимым) для "Продолжить, когда необработанный код пользователя" установлен НЕ. Логика VS2015 не считает, что мой глобальный обработчик исключенных обработчиков исключений "обрабатывается в коде пользователя", поэтому он нарушает их; однако он не ломается на пойманных исключениях. Это заставляет работать как VS2013.

Ответ 4

Для гуглера, который хочет разбить только тогда, когда исключение касается их кода, в Visual Studio 2015 есть опция: Параметры- > Отладка- > Общие- > Только мой код. После проверки он позволяет не ломаться, когда исключение управляется (бросается и выхватывается) вне вашего кода.

Ответ 5

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

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

Например, посмотрите на этот код:

class Program
{
    static void Main(string[] args)
    {
        Test();
        Console.ReadLine();
    }

    private async static Task Test()
    {
        await Task.Delay(100);
        throw new Exception("Exception!");
    }
}

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

Обратите внимание, что в этом случае реальная проблема заключается в том, что Task, возвращаемый Test(), никогда не проверяется. Если в вашем коде есть аналогичные типы логики "огонь и забухание", вы не увидите исключений в момент их броска (даже если они "необработаны" внутри метода); исключение появляется только тогда, когда вы наблюдаете Задание, ожидая его, проверяя его результат или явно просматривая его Исключение.

Это всего лишь предположение, но я думаю, что вы, вероятно, наблюдаете что-то вроде этого.

Ответ 6

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

В ожидании, что если вы до родительской группы "CLR", то вы не должны получить какой-либо разрывный execpt для необработанного. Вы всегда будете ломаться, если исключение будет необработанным. Но, если у вас есть группа CLR, не считающаяся, код внутри try... catch просто не должен вызывать перерыв. Это не так.

Решение. В новой панели инструментов настроек щелкните правой кнопкой мыши и выберите "восстановить по умолчанию". Таадаааа... Он снова ведет себя нормально. Теперь не вините его.

Ответ 7

Попробуйте выполнить следующие инструкции:

  • В окне "Настройки исключения" откройте контекстное меню, щелкнув правой кнопкой мыши в окне и выбрав "Показать столбцы". (Если вы отключили Just My Code, вы не увидите эту команду.)
  • Вы должны увидеть второй столбец с надписью "Дополнительные действия". Этот столбец отображает "Продолжить", если он не обрабатывается кодом пользователя на определенных исключениях, что означает, что отладчик не прерывается, если это исключение не обрабатывается в коде пользователя, а обрабатывается во внешнем коде.
  • Вы можете изменить этот параметр либо для конкретного исключения (выберите исключение, щелкните правой кнопкой мыши и выберите/отмените выбор "Продолжить", если "Не обрабатывается в пользовательском коде" ) или для всей категории исключений (например, все исключения времени выполнения Common Language Runtime).

https://msdn.microsoft.com/en-us/library/x85tt0dd.aspx

Ответ 8

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

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

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

Например, на скриншоте ниже отладчик будет прерываться всякий раз, когда вызывается System.AccessViolationException, но для всех остальных исключений он будет только разорваться, если исключение было обработано пользователем.

Окно инструментальных средств для Visual Studio 2015

Ответ 9

Когда я обновился до VS2015, у меня также были проблемы, в которых исключения, используемые для "разрыва" приложения, но теперь игнорируются и передаются прямо. Бывают случаи, когда мы хотим, чтобы наш код преднамеренно выдавал исключения в местах, где мы хотим, чтобы код останавливался, а не продолжался. Мы всегда используем фразу Throw New Exception("Message"), чтобы заставить наш код преднамеренно нарушить:

    If SomethingReallyBad = True Then
        Throw New Exception("Something Really Bad happened and we cannot continue.")
    End If

С VS2015 классический "System.Exception" - это то, что бросается, когда мы говорим Throw New Exception. Поэтому нам нужно было проверить галочку "System.Exception" в новых настройках исключения:

Проверьте окно System.Exception

После проверки наш код сделал так, как ожидалось.

Ответ 10

Решение состоит в том, что это семантически противоположно тому, что вы считаете настройкой. Вы должны убедиться, что Продолжить, когда необработанный код пользователя не включен, т.е. не отмечен, как показано в столбце Дополнительные действия на вкладке "Исключения" - см. Ниже:

вы эффективно говорите, что не продолжайте (т.е. перерыв), когда необработанные в коде

Окно настроек исключения (Control + Alt + E)

Для этого:

  • Щелкните правой кнопкой мыши исключение или набор исключений, о которых вы заботитесь (т.е. обычно верхняя строка "Исключения для обычного языка Runtime" в дереве)
  • Выберите параметр "Продолжить", когда "Не обрабатывается в пользовательском коде" (см. ниже).
  • Убедитесь, что исключения не отмечены (см. ниже)
  • продолжить отладку

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

Это сделало это для меня - снова счастлив.

Это было в VS 2015

Ответ 11

В Visual Studio определенно есть ошибка, которая может заставить ее застревать, требуя перезагрузки. Даже VS2015.

У меня была ситуация с одним потоком, в которой NullReferenceException попадал в "внешний" обработчик (все еще в моем коде), хотя я попросил его сломаться, когда он был поднят.

Я понимаю, что это "обработанное" исключение, и вы говорите "необработанный", но я уверен, что иногда быстрый перезапуск VS исправляет это, если IISRESET этого не делает.