Введение в теорию программирования. Объектно-ориентированный подход

Событийно-ориентированное программирование

Разбить на страницы
Показывать лекцию целиком

Теоретические сведения

Обработка событий

Под событием будем понимать автоматическое извещение о каком-либо действии среды программирования или пользователя. События являются членами класса и объявляются с использованием ключевого слова event. Реализация механизма событий в языке программирования C# основана на использовании делегатов.

Описание события

Синтаксис:

event имя_делегата имя_обьекта;

Широковещательные события

Некоторые события могут активизировать несколько процедур обработки, в том числе определенных в других объектах. Такие события называются широковещательными. Реализация механизма широковещательных событий в языке программирования C# основана на использовании многоадресных делегатов.

Пример управления событиями посредством делегата:

// Объявление делегата, на основе которого
// будет определено событие. 
delegate void MyEventHandler () ;

// Объявление класса, в котором 
// инициируется событие. 
class MyEvent 
{
    public event MyEventHandler activate;
    // В этом методе инициируется событие.

    public void fire() 
    { 
        if (activate != null) activate(); 
    }
}    

class X 
{
    public void Xhandler()
    {
    Console.WriteLine("Событие получено
        объектом класса X.");
    }
}
    
class Y 
{
    public void Yhandler() 
    {
        Console.WriteLine("Событие получено 
            объектом класса Y.");
    }
}
    
class EventDemo
{
    static void handler() 
    {
        Console.WriteLine("Событие получено
            объектом класса EventDemo.")
    }

    public static void Main()
    {
    MyEvent evt = new MyEvent();
    X xOb = new X();
    Y yOb = new Y();
    
// Добавление методов handler (), XhandlerО 
// и YhandlerO в цепочку обработчиков события.
    evt.activate += new 
        MyEventHandler(handler);
    evt.activate += new 
        MyEventHandler(xOb.Xhandler);
    evt.activate += new 
        MyEventHandler(yOb.Yhandler);
    evt.fire();
    Console.WriteLine();
    evt.activate -= new 
        MyEventHandler(xOb.Xhandler);
    evt.fire();
    }
}

Исключительные ситуации

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

Для обработки исключений в языке С# примененяются следующие ключевые слова: try, catch, throw, finally. Перечисленные ключевые слова образуют взаимосвязанную подсистему, в которой использование одного из ключевых слов влечет за собой использование других.

Обработка исключений в языке C# реализуется на основе операторных блоков try и catch.

Описание блока try и catch

Синтаксис:

try {
Блок_кода_для_которого_выполняется
мониторинг_ошибок}
catch (ExcepTypel ехОb) 
    { Обработчик_исключений_ExcepTypel }
catch (ЕхсерТуре2 ехОb) 
    {Обработчик_исключений_ЕхсерТуре2 }

Основные системные исключения приведены в таблице 10.

Тип исключения в операторе catch должен соответствовать типу перехватываемого исключения. Неперехваченное исключение непременно приводит к досрочному прекращению выполнения программы.

Основные системные исключения
Исключение Значение
ArrayTypeMismatchException Тип сохраненного значения несовместим с типом массива
DivideByZeroException Предпринята попытка деления на ноль
IndexOutOfRangeException Индекс массива выходит за пределы диапазона
InvalidCastException Некорректное преобразование в процессе выполнения
OutOfMemoryException Вызов new был неудачным из-за недостатка памяти
Overflow/Exception Переполнение при выполнении арифметической операции
StackOverflowException Переполнение стека

Для выполнения перехвата исключений вне зависимости от их типа (перехват всех исключений) возможно использование оператора catch без параметров.

Возврат из исключения

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

С целью предотвращения этой ситуации возможно указание блока кода, который вызывается после выхода из блока try / catch, с помощью блока finally в конце последовательности try / catch.

Конструкция try/catch с блоком finally

Синтаксис:

try {
// Блок кода, выполняющий мониторинг ошибок
}
catch (ExcepTypel ех1) {
//1 Обработка исключения ExcepTypel. 
}

catch (ЕхсерТуре2 ех2) {
// 2 Обработка исключения ЕхсерТуре2 .
finally {
// Код блока finally. 
}

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

Генерация исключений

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

Оператор throw

Синтаксис:

throw exceptOb;

Исключение, перехваченное одним оператором catch, может генерироваться повторно, и благодаря этому перехватываться внешним оператором catch. Для этого указывается ключевое слово throw без имени исключения.

Наследование классов исключений

Можно создавать заказные исключения, выполняющие обработку ошибок в пользовательском коде. Генерация исключений не представляет принципиальных сложностей, для этого требуется всего лишь определить класс, наследуемый из класса Exception. В качестве общего правила следует руководствоваться тем, что определенные пользователем исключения наследуются из класса ApplicationException, так как они представляют собой иерархию зарезервированных исключений, связанных с приложениями. Наследуемые классы не нуждаются в фактической реализации в каком-либо виде, поскольку сам факт их существования в системе типов данных позволяет воспользоваться ими в качестве исключений.

Создаваемые пользователем классы исключений автоматически получают доступные для них свойства и методы, определенные в классе Exception.

Порядок выполнения работы

  • Реализовать программу на языке C# в соответствии с вариантом исполнения.
  • Графически проиллюстрировать место реализованного исключения в общей иерархии.
  • Варианты заданий

    Реализовать обработку ошибок для лабораторной работы №9, при этом переопределив с помощью наследования событие:

  • StackOverflowException
  • ArrayTypeMismatchException
  • DivideByZeroException
  • IndexOutOfRangeException
  • InvalidCastException
  • OutOfMemoryException
  • OverflowException
  • Страницы:

    Теоретические сведения

    Обработка событий

    Под событием будем понимать автоматическое извещение о каком-либо действии среды программирования или пользователя. События являются членами класса и объявляются с использованием ключевого слова event. Реализация механизма событий в языке программирования C# основана на использовании делегатов.

    Описание события

    Синтаксис:

    event имя_делегата имя_обьекта;

    Широковещательные события

    Некоторые события могут активизировать несколько процедур обработки, в том числе определенных в других объектах. Такие события называются широковещательными. Реализация механизма широковещательных событий в языке программирования C# основана на использовании многоадресных делегатов.

    Пример управления событиями посредством делегата:

    // Объявление делегата, на основе которого
    // будет определено событие. 
    delegate void MyEventHandler () ;
    
    // Объявление класса, в котором 
    // инициируется событие. 
    class MyEvent 
    {
        public event MyEventHandler activate;
        // В этом методе инициируется событие.
    
        public void fire() 
        { 
            if (activate != null) activate(); 
        }
    }    
    
    class X 
    {
        public void Xhandler()
        {
        Console.WriteLine("Событие получено
            объектом класса X.");
        }
    }
        
    class Y 
    {
        public void Yhandler() 
        {
            Console.WriteLine("Событие получено 
                объектом класса Y.");
        }
    }
        
    class EventDemo
    {
        static void handler() 
        {
            Console.WriteLine("Событие получено
                объектом класса EventDemo.")
        }
    
        public static void Main()
        {
        MyEvent evt = new MyEvent();
        X xOb = new X();
        Y yOb = new Y();
        
    // Добавление методов handler (), XhandlerО 
    // и YhandlerO в цепочку обработчиков события.
        evt.activate += new 
            MyEventHandler(handler);
        evt.activate += new 
            MyEventHandler(xOb.Xhandler);
        evt.activate += new 
            MyEventHandler(yOb.Yhandler);
        evt.fire();
        Console.WriteLine();
        evt.activate -= new 
            MyEventHandler(xOb.Xhandler);
        evt.fire();
        }
    }

    Исключительные ситуации

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

    Для обработки исключений в языке С# примененяются следующие ключевые слова: try, catch, throw, finally. Перечисленные ключевые слова образуют взаимосвязанную подсистему, в которой использование одного из ключевых слов влечет за собой использование других.

    Обработка исключений в языке C# реализуется на основе операторных блоков try и catch.

    Описание блока try и catch

    Синтаксис:

    try {
    Блок_кода_для_которого_выполняется
    мониторинг_ошибок}
    catch (ExcepTypel ехОb) 
        { Обработчик_исключений_ExcepTypel }
    catch (ЕхсерТуре2 ехОb) 
        {Обработчик_исключений_ЕхсерТуре2 }

    Основные системные исключения приведены в таблице 10.

    Тип исключения в операторе catch должен соответствовать типу перехватываемого исключения. Неперехваченное исключение непременно приводит к досрочному прекращению выполнения программы.

    Основные системные исключения
    Исключение Значение
    ArrayTypeMismatchException Тип сохраненного значения несовместим с типом массива
    DivideByZeroException Предпринята попытка деления на ноль
    IndexOutOfRangeException Индекс массива выходит за пределы диапазона
    InvalidCastException Некорректное преобразование в процессе выполнения
    OutOfMemoryException Вызов new был неудачным из-за недостатка памяти
    Overflow/Exception Переполнение при выполнении арифметической операции
    StackOverflowException Переполнение стека

    Для выполнения перехвата исключений вне зависимости от их типа (перехват всех исключений) возможно использование оператора catch без параметров.

    Возврат из исключения

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

    С целью предотвращения этой ситуации возможно указание блока кода, который вызывается после выхода из блока try / catch, с помощью блока finally в конце последовательности try / catch.

    Конструкция try/catch с блоком finally

    Синтаксис:

    try {
    // Блок кода, выполняющий мониторинг ошибок
    }
    catch (ExcepTypel ех1) {
    //1 Обработка исключения ExcepTypel. 
    }
    
    catch (ЕхсерТуре2 ех2) {
    // 2 Обработка исключения ЕхсерТуре2 .
    finally {
    // Код блока finally. 
    }

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

    Генерация исключений

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

    Оператор throw

    Синтаксис:

    throw exceptOb;

    Исключение, перехваченное одним оператором catch, может генерироваться повторно, и благодаря этому перехватываться внешним оператором catch. Для этого указывается ключевое слово throw без имени исключения.

    Наследование классов исключений

    Можно создавать заказные исключения, выполняющие обработку ошибок в пользовательском коде. Генерация исключений не представляет принципиальных сложностей, для этого требуется всего лишь определить класс, наследуемый из класса Exception. В качестве общего правила следует руководствоваться тем, что определенные пользователем исключения наследуются из класса ApplicationException, так как они представляют собой иерархию зарезервированных исключений, связанных с приложениями. Наследуемые классы не нуждаются в фактической реализации в каком-либо виде, поскольку сам факт их существования в системе типов данных позволяет воспользоваться ими в качестве исключений.

    Создаваемые пользователем классы исключений автоматически получают доступные для них свойства и методы, определенные в классе Exception.

    Порядок выполнения работы

  • Реализовать программу на языке C# в соответствии с вариантом исполнения.
  • Графически проиллюстрировать место реализованного исключения в общей иерархии.
  • Варианты заданий

    Реализовать обработку ошибок для лабораторной работы №9, при этом переопределив с помощью наследования событие:

  • StackOverflowException
  • ArrayTypeMismatchException
  • DivideByZeroException
  • IndexOutOfRangeException
  • InvalidCastException
  • OutOfMemoryException
  • OverflowException
  • Вернуться к учебному плану