Упражнение. Реализация обработки исключений try-catch

Завершённый

Шаблон try-catch состоит из try блока, за которым следует одно или несколько catch предложений. Каждое catch предложение задает обработчик для другого типа исключения.

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

В этом упражнении вы реализуете базовый try-catch шаблон.

Создайте новый проект кода

Первым шагом является создание проекта кода, используемого во время этого модуля.

  1. Откройте новый экземпляр Visual Studio Code.

  2. В меню "Файл" выберите "Открыть папку".

  3. В диалоговом окне "Открыть папку " перейдите в папку "Рабочий стол Windows".

  4. В диалоговом окне "Открыть папку " выберите "Создать папку".

  5. Назовите новую папку Exceptions101 и выберите "Выбрать папку".

  6. В меню "Терминал " выберите "Новый терминал".

    Вы будете использовать команду .NET CLI для создания нового консольного приложения.

  7. В командной строке панели терминала введите следующие команды:

    dotnet new console
    
  8. Закройте панель ТЕРМИНАЛА.

Реализовать простой механизм try-catch

  1. Откройте файл Program.cs с помощью представления обозревателя Visual Studio Code.

  2. В меню "Вид" выберите палитру команд.

  3. В командной строке введите .net: g , а затем выберите .NET: Создать ресурсы для сборки и отладки.

  4. Замените содержимое файла Program.cs следующим кодом:

    double float1 = 3000.0;
    double float2 = 0.0;
    int number1 = 3000;
    int number2 = 0;
    
    Console.WriteLine(float1 / float2);
    Console.WriteLine(number1 / number2);
    Console.WriteLine("Exit program");
    
  5. Минуту, чтобы проверить код.

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

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

  6. В меню "Запуск " выберите "Начать отладку".

    Обратите внимание, что DivideByZeroException исключение возникает при делении целых значений.

    Замечание

    Возможно, вы заметили, что уравнение с помощью переменных типа double может завершиться без возникновения ошибки. Вычисление деления на ноль с помощью переменных типа double возвращает результат, равный бесконечности, -бесконечности или "не числу". Это не означает, что вы всегда должны использовать переменные типа double вместо типов int или decimal. Правильный подход заключается в использовании переменных соответствующего типа и реализации обработки исключений для перехвата любых ошибок, которые могут возникнуть.

  7. На панели инструментов отладки нажмите кнопку "Продолжить".

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

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

    ∞
    Unhandled exception. System.DivideByZeroException: Attempted to divide by zero.
       at Program.<Main>$(String[] args) in C:\Users\msuser\Desktop\Exceptions101\Program.cs:line 7
    

    Обратите внимание, что необработанное исключение вызвало завершение работы приложения после завершения первой Console.WriteLine() инструкции.

    Замечание

    По умолчанию Visual Studio Code использует другой цвет текста для отображения сообщений, созданных отладчиком. Это помогает разработчику различать выходные данные приложения и сообщения отладчика. Если требуется более чистое представление выходных данных приложения, можно настроить файл launch.json для использования другой консоли. Например, установите console, чтобы использовать панель терминала для выходных данных приложения integratedTerminal. Сообщения отладчика всегда отображаются на панели КОНСОЛИ ОТЛАДКИ.

  9. Заключите два вычисления в блок try кода инструкции следующим образом:

    double float1 = 3000.0;
    double float2 = 0.0;
    int number1 = 3000;
    int number2 = 0;
    
    try
    {
        Console.WriteLine(float1 / float2);
        Console.WriteLine(number1 / number2);
    }
    
    Console.WriteLine("Exit program");
    
  10. Обратите внимание на красную волнистую линию под закрывающей скобкой try блока.

    Для синтаксиса C# требуется, чтобы при использовании инструкции catch было предложение finally или try.

  11. Создайте блок кода catch под блоком кода try следующим образом.

    try
    {
        Console.WriteLine(float1 / float2);
        Console.WriteLine(number1 / number2);
    }
    catch
    {
        Console.WriteLine("An exception has been caught");
    }
    
  12. В меню "Файл Visual Studio Code" нажмите кнопку "Сохранить".

  13. В меню "Запуск " выберите "Начать отладку".

  14. Чтобы просмотреть выходные данные, созданные приложением, займет минуту.

    ∞
    An exception has been caught
    Exit program
    
  15. Обратите внимание, что хотя исключение по-прежнему возникает, приложение теперь сможет завершить выполнение оставшихся строк кода перед закрытием.

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

Перехват исключений, создаваемых в вызываемые методы

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

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

  1. Замените код в файле Program.cs следующим кодом:

    try
    {
        Process1();
    }
    catch
    {
        Console.WriteLine("An exception has occurred");
    }
    
    Console.WriteLine("Exit program");
    
    static void Process1()
    {
        WriteMessage();
    }
    
    static void WriteMessage()
    {
        double float1 = 3000.0;
        double float2 = 0.0;
        int number1 = 3000;
        int number2 = 0;
    
        Console.WriteLine(float1 / float2);
        Console.WriteLine(number1 / number2);
    }
    
  2. Чтобы просмотреть обновленный код, сделайте минуту.

    • Инструкции верхнего уровня включают try блок кода, вызывающий Process1() метод.
    • Метод Process1() вызывает WriteMessage() метод.
    • Метод WriteMessage() содержит код, в котором DivideByZeroException будет выброшено исключение.

    Обратите внимание, что исключение будет создано в методе, который на два уровня стека вызовов выше, чем кодовые блоки try и catch.

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

    Операторы верхнего уровня представлены в виде метода, именуемого Main, в стеке вызовов.

  3. В меню "Файл Visual Studio Code" нажмите кнопку "Сохранить".

  4. В меню "Запуск " выберите "Начать отладку".

  5. Чтобы просмотреть выходные данные, созданные приложением, займет минуту.

    ∞
    An exception has occurred
    Exit program
    
  6. Обратите внимание, что несмотря на то, что исключение выбрасывается двумя уровнями выше в стеке вызовов, оно по-прежнему успешно обрабатывается.

Обзор

Ниже приведены некоторые важные моменты, которые следует помнить из этого урока:

  • try-catch Реализуйте шаблон для try указанных строк кода в приложении и обрабатывайте catch исключения, которые происходят в пределах try блока кода.
  • Используйте оператор catch для перехвата исключения, вызванного на том же уровне стека вызовов.
  • Используйте конструкцию catch, чтобы перехватить исключение, брошенное на более высоком уровне стека вызовов.