Шаг 231.
Язык программирования C#. Начала.
Обработка исключений. Использование исключений. Пример 4

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

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

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

namespace pr231_1
{
    // Класс исключения: 
    class  MyException: Exception {
        // Закрытые текстовые поля:
        private string time; 
        private string source;
        // Конструктор создания объекта исключения:
        public MyException(Exception obj): 
            base("Ошибка класса MyException") { 
            // Класс исходной ошибки: 
            source = obj.GetType().Name;
            // Дата и время генерирования ошибки:
            time = DateTime.Now.ToString();
        }
        // Переопределение метода ToString(): 
        public override string ToString() { 
            string txt = Message + "\n"; 
            txt += "Исходный класс ошибки: " + source + "\n"; 
            txt += "Дата и время генерирования: " + time; 
            return txt;
        }
    }
    
    // Главный класс:
    class Program
    {
        // Главный метод:
        static void Main()
        {
            // Внешний try-блок: 
            try {
                // Внутренний try-блок: 
                try {
                    // Массив из одного элемента: 
                    int[] a = {1};
                    // Обращение к несуществующему элементу 
                    // массива (генерирование ошибки): 
                    a[1] = 2;
                }
                // Внутренний catch-блок: 
                catch(Exception e) {
                    // Создание объекта исключения: 
                    MyException me = new MyException(e);
                    // Генерирование исключения: 
                    throw me;
                }
            }
            // Внешний catch-блок: 
            catch(Exception e) {
                Console.WriteLine(e);
            }
            // Задержка:
            Console.ReadLine();
        }
    }
}
Архив проекта можно взять здесь.

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


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

    Интерес представляет класс MyException. Класс имеет два закрытых текстовых поля source и time. Также в классе описан конструктор, который позволяет создавать объекты класса MyException на основе объектов класса Exception (а значит, и на основе объектов всех производных классов от класса Exception). Конструктору производного класса передается текст "Ошибка класса MyException", который определяет значение свойства Message создаваемого объекта. Полю source присваивается значение obj.GetType().Name. Это название класса для объекта исключения. На основе этого класса создается новый объект исключения. Полю time в качестве значения присваивается выражение DateTime.Now.ToString(). Здесь мы использовали структуру DateTime из пространства имен System. С помощью статического свойства Now получаем ссылку на экземпляр структуры DateTime, содержащий информацию о текущей дате и времени (определяется по системным часам компьютера). С помощью метода ToString(), который вызывается из этого экземпляра, получаем текстовую строку с датой и временем. Именно эта текстовая строка становится значением поля time.

    Метод ToString() переопределен так, что результатом возвращается текст, содержащий значение свойства Message объекта исключения, а также значения полей source и time (с дополнительными текстовыми пояснениями).

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

  int[] a = {1};
создается массив из одного элемента. После этого размещена команда
  a[1] = 2;      , 
при выполнении которой происходит ошибка (обращение к несуществующему элементу массива). Эта ошибка перехватывается и обрабатывается во внутреннем catch-блоке. Обработка состоит в том, что командой
  MyException me = new MyException(e);
создается объект me класса MyException. Объект создается на основе объекта исключения e, переданного для обработки. После этого командой
  throw me;
искусственно генерируется исключение пользовательского класса. Это исключение перехватывается во внешнем catch-блоке. Там объект исключения передается аргументом методу WriteLine(), в результате чего для объекта вызывается метод ToString(), и полученное текстовое значение отображается в консольном окне. Хочется верить, что содержимое сообщения комментариев не требует.

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




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