Поделиться через


Управление исключениями с помощью отладчика в Visual Studio

Исключение — это указание состояния ошибки, возникающего во время выполнения программы. Вы можете указать отладчику, на каких исключениях или наборах исключений следует остановиться, и в какой момент следует это сделать (то есть приостановить выполнение программы в отладчике). При остановке отладчика отображается, где было вызвано исключение. Кроме того, можно добавлять или удалять исключения. При открытом решении в Visual Studio используйте "Отладка > Windows >" параметры исключений, чтобы открыть окно «Параметры исключений».

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

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

  • Выбрасывается исключение, которое не обрабатывается.
  • Отладчик настраивается для прерывания выполнения перед вызовом любого обработчика.
  • Вы включили Just My Code, и отладчик настроен на остановку при любом исключении, которое не обработано в пользовательском коде.

Замечание

ASP.NET имеет обработчик исключений верхнего уровня, показывающий страницы ошибок в браузере. Он не прерывает выполнение, если только не включен только мой код . Пример см. в разделе "Сообщить отладчику продолжить использование необработанных пользователем исключений " ниже.

Замечание

В приложении Visual Basic отладчик обрабатывает все ошибки как исключения, даже если вы используете обработчики ошибок в стиле On Error.

Сообщите отладчику остановиться при возникновении исключения

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

В окне "Параметры исключений" (отладка > параметров исключений Windows>) разверните узел для категории исключений, таких как исключения среды CLR. Затем установите флажок для определенного исключения в этой категории, например System.AccessViolationException. Вы также можете выбрать всю категорию исключений.

Снимок экрана флажка

Подсказка

Конкретные исключения можно найти с помощью окна поиска на панели инструментов "Параметры исключений " или использовать поиск для фильтрации определенных пространств имен (например, System.IO).

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

  • В следующем консольном приложении C# метод Main вызывает AccessViolationException внутри try/catch блока.

    static void Main(string[] args)
    {
        try
        {
            throw new AccessViolationException();
            Console.WriteLine("here");
        }
        catch (Exception e)
        {
            Console.WriteLine("caught exception");
        }
        Console.WriteLine("goodbye");
    }
    

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

    caught exception
    goodbye
    

    но он не отображает here строку.

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

    public class Class1
    {
        public void ThrowHandledException()
        {
            try
            {
                throw new AccessViolationException();
            }
            catch (AccessViolationException ave)
            {
                Console.WriteLine("caught exception" + ave.Message);
            }
        }
    
        public void ThrowUnhandledException()
        {
            throw new AccessViolationException();
        }
    }
    

    Ниже приведен метод Main() консольного приложения:

    static void Main(string[] args)
    {
        Class1 class1 = new Class1();
        class1.ThrowHandledException();
        class1.ThrowUnhandledException();
    }
    

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

Чтобы восстановить настройки исключений по умолчанию, нажмите кнопку Восстановить список к настройкам по умолчанию.

Снимок экрана: восстановление значений по умолчанию в параметрах исключений.

Сообщите отладчику продолжить использование необработанных пользователем исключений

При отладке кода .NET или JavaScript с помощью Just My Code можно сообщить отладчику, чтобы предотвратить нарушение исключений, которые не обрабатываются в пользовательском коде, но обрабатываются в другом месте.

  1. В окне "Параметры исключения " откройте контекстное меню, щелкнув правой кнопкой мыши метку столбца, а затем выберите "Показать столбцы дополнительных > действий". (Если вы отключили только мой код, вы не увидите эту команду.) Появится третий столбец с именем "Дополнительные действия ".

    Снимок экрана: столбец

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

  2. Чтобы изменить этот параметр для конкретного исключения, выберите исключение, щелкните правой кнопкой мыши, чтобы отобразить контекстное меню, и выберите "Продолжить без обработки в пользовательском коде". Вы также можете изменить параметр для всей категории исключений, таких как все исключения среды CLR).

    Снимок экрана:

Например, ASP.NET веб-приложения обрабатывают исключения, преобразовав их в код состояния HTTP 500 (обработка исключений в веб-API ASP.NET), что может не помочь определить источник исключения. В приведенном ниже примере код пользователя вызывает String.Format(), который выбрасывает FormatException исключение. Перерывы в выполнении следующие.

Разрывы исключений, необработанных пользователем

Добавление и удаление исключений

Можно добавлять и удалять исключения. Чтобы удалить тип исключения из категории, выберите исключение и нажмите кнопку "Удалить выбранное исключение " (знак минуса) на панели инструментов "Параметры исключения ". Вы также можете щелкнуть исключение правой кнопкой мыши и выбрать пункт "Удалить " в контекстном меню. Удаление исключения имеет тот же эффект, что и при том, когда исключение не отмечено, т. е. отладчик не останавливается при его возникновении.

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

  1. В окне "Параметры исключения" выберите одну из категорий исключений (например, Общее средство выполнения языков).

  2. Нажмите кнопку "Добавить исключение" в выбранную категорию (знак плюса).

    Снимок экрана: добавление исключения к выбранной кнопке категории.

  3. Введите имя исключения (например, System.UriTemplateMatchException).

    Снимок экрана: имя исключения типа.

    Исключение добавляется в список (в алфавитном порядке) и автоматически проверяется.

Чтобы добавить исключение в исключения доступа к памяти GPU, исключения среды выполнения JavaScript или исключения Win32, включите код ошибки и описание.

Подсказка

Проверьте орфографию! Окно параметров исключений не проверяет наличие добавленного исключения. Поэтому при вводе Sytem.UriTemplateMatchException вы получите запись для этого исключения (а не для System.UriTemplateMatchException).

Параметры исключения сохраняются в suo-файле решения, поэтому они применяются к конкретному решению. Не удается повторно использовать определенные параметры исключений в решениях. Теперь сохраняются только добавленные исключения; удалённые исключения не сохраняются. Вы можете добавить исключение, закрыть и повторно открыть решение, и исключение по-прежнему будет там. Но при удалении исключения и закрытии или повторном открытии решения исключение будет вновь появиться.

Окно "Параметры исключений" поддерживает универсальные типы исключений в C# , но не в Visual Basic. Чтобы разорвать такие исключения MyNamespace.GenericException<T>, необходимо добавить исключение в качестве MyNamespace.GenericException'1. То есть, если вы создали исключение, например этот код:

public class GenericException<T> : Exception
{
    public GenericException() : base("This is a generic exception.")
    {
    }
}

Вы можете добавить исключение в параметры исключений с помощью предыдущей процедуры:

Снимок экрана: добавление универсального исключения.

Добавление условий в исключение

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

Замечание

Добавление условий в исключение поддерживается начиная с Visual Studio 2017.

Добавление условных исключений:

  1. Нажмите кнопку "Изменить условия " в окне "Параметры исключения" или щелкните исключение правой кнопкой мыши и выберите "Изменить условия".

    Снимок экрана условий исключения.

  2. Чтобы добавить дополнительные обязательные условия к исключению, выберите "Добавить условие " для каждого нового условия. Отображаются дополнительные строки условий.

    Снимок экрана: дополнительные условия исключения.

  3. Для каждой строки условия введите имя модуля и измените список операторов сравнения на Equals или Not Equals. Можно указать подстановочные знаки (\*) в имени, чтобы указать несколько модулей.

  4. Если необходимо удалить условие, выберите X в конце строки условия.