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

Visual Studio: редактировать и продолжать обработанные исключения?

Здесь код, воспроизводящий поведение, которое я ожидаю получить:

    static void Main(string[] args)
    {
        // try // #2
        {
            string x = null; // #1
            AssertNotNull(x, nameof(x));
        }
        // catch (ArgumentNullException) { } // #2
        Console.WriteLine("Passed.");
        Console.ReadKey();
    }

    [DebuggerHidden]
    public static void AssertNotNull<T>(T arg, string argName) where T : class
    {
        if (arg == null)
            throw new ArgumentNullException(argName);
    }

Поведение одинаково для любого VS, начиная с VS2008 (не проверял более ранние версии).

Если вы запустите его под отладкой (используя стандартные параметры отладки), вам не разрешается продолжать работу до тех пор, пока вы не исправите код (используя EnC). Удар F5 будет просто повторять утверждение из-за [DebuggerHidden] и комбинации "Unwind stack on unhandled exception" (настройка включена по умолчанию).

Чтобы исправить код, просто замените строку # 1 на object x = "", установите для нее следующий оператор и снова нажмите F5.

Теперь включите "break when throw" для исключения ArgumentNullException и раскомментируйте строки, помеченные # 2. Изменение поведения: вы снова остановились на утверждении, но стек не разматывается (легко проверить с помощью окна CallStack). F5 будет продолжаться с места, где было исключено исключение.

Хорошо, так... теперь вопрос: Есть ли способ включить автоматическое раскручивание стека при нарушении обработанных исключений?

Скрытая опция VS, существующее расширение или (возможно) API, который может использоваться из моего собственного расширения?

UPD: Чтобы прояснить вопрос: я хочу сломать строку с неудачным утверждением, отредактировать код с помощью редактирования и продолжить, установить следующий оператор в фиксированный код и продолжить выполнение.

Как это работает, если исключение не попало в стек.

UPD2 Как было предложено Хансом Пассантом: опубликовано предложение о UserVoice. Не стесняйтесь проголосовать:)

4b9b3361

Ответ 1

и раскомментируйте строки, помеченные # 2

Это критическая часть вашего вопроса. Вы изменили несколько факторов, критическое изменение в том, что вы изменили способ разворота стека. Отладочная опция, которая вам нравится, называется "Unwind stack при необработанном исключении". Проблема в том, что никакого необработанного исключения больше нет. Предложение catch выдает его, и теперь CLR раскручивает стек.

И это должен быть CLR, который выполняет разматывание, отладчик не имеет возможности сделать это в первом перерыве исключения, о котором вы просили. И SetNext не может работать в этой точке. Что, если я правильно интерпретирую вопрос, вам бы очень хотелось, потому что то, что вам нужно сделать дальше, - это занятая работа, одиночный шаг через блокирующий блок - это не огромная радость.

Хотя он не реализован, я думаю, что он технически умен. Но только потому, что я блаженно не знаю, сколько работы потребуется команде отладчика. Хорошо спросить, чтобы E + C работал лучше, вы можете предложить его здесь. Отправьте URL-адрес вашему предложению в виде компромисса и хороших шансов, он получит кучу голосов. Я проголосую за него.

Ответ 2

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

  • Откройте меню "Настройки исключения" (Debug > Windows > Настройки исключения)
  • В разделе "Исключения общего времени выполнения языка" установите флажок "System.ArgumentNullException". (Или проверить их все, что бы вы ни искали.)

Теперь он должен прерываться всякий раз, когда вызывается System.ArgumentNullException, независимо от того, будет ли он попадать в блок catch.

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

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