Шаг 225.
Язык программирования C#. Начала.
Обработка исключений. Генерация исключений

    На этом шаге мы рассмотрим средства преднамеренной генерации исключений.

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

    Сгенерировать исключение достаточно просто. Для этого используют инструкцию throw, после которой указывается объект исключения. Объект исключения можно создать в явном виде (то есть так, как создаются объекты обычных классов). Также в catch-блоке можно воспользоваться объектом, созданным автоматически при возникновении реальной ошибки (повторная генерация исключения). Правда исключение, перехваченное в catch-блоке, может быть сгенерировано повторно и более простым способом. Для этого используют инструкцию throw, не указывая явно объект исключения.


Само по себе создание объекта на основе класса исключения не означает генерирования исключения. Необходимо использовать инструкцию throw, после которой указать объект исключения.

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace pr225_1
{
    // Класс с главным методом: 
    class Program
    {
        // Главный метод:
        static void Main()
        {
            // Внешний try-блок:
            try
            {
                // Внутренний try-блок: 
                try
                {
                    Console.WriteLine("Ceйчac будет ошибка...");
                    // Генерация исключения:
                    throw new ArithmeticException("Какая-то ошибка");
                }
                // Перехват исключения во внутреннем блоке: 
                catch (ArithmeticException e)
                {
                    Console.WriteLine(e.Message);
                    // Повторное генерирование исключения: 
                    throw;
                }
            }
            // Перехват исключения во внешнем блоке: 
            catch (ArithmeticException e)
            {
                Console.WriteLine("Еще раз: \"{0}\"", e.Message);
            }
            // Задержка:
            Console.ReadLine();
        }
    }
}
Архив проекта можно взять здесь.

    Результат выполнения программы представлен ниже:


Рис.1. Результат выполнения программы

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

  Console.WriteLine("Ceйчac будет ошибка...");
генерируется исключение класса ArithmeticException. Для этого мы использовали инструкцию throw, после которой указана команда
  new ArithmeticException("Какая-то ошибка");
создания анонимного объекта класса ArithmeticException. Текст, переданный в качестве аргумента конструктору класса, становится значением свойства Message объекта исключения.


В принципе, мы могли бы создать обычный (не анонимный) объект класса ArithmeticException, а затем указать этот объект в throw-инструкции. Еще раз подчеркнем, что само по себе создание объекта исключения не приводит к генерации ошибки.

    Перехват сгенерированного исключения выполняется во внутреннем catch-блоке. Там командой

  Console.WriteLine(e.Message); 
отображается описание ошибки, а затем командой throw исключение генерируется повторно. Важный момент состоит в том, что объект исключения точно тот же, что был создан ранее при искусственном генерировании исключения. Проверить это легко. Повторно сгенерированное исключение перехватывается и обрабатывается во внешнем catch-блоке. В нем отображается значение свойства Message объекта исключения, и оно такое же, как аргумент, переданный конструктору класса ArithmeticException при создании объекта исключения.

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

    На следующем шаге мы рассмотрим пользовательские классы исключений.




Предыдущий шаг Содержание Следующий шаг