Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Введение в теорию программирования. Объектно-ориентированный подход. Учебное пособие для СПО
.pdf
весьма многообразно.
Для удобства систематизации, хранения, поиска и анализа исключений,
а также в силу особенностей строения системы типизации Microsoft
.NET, классификация исключительных ситуаций в ней организована по
иерархическому принципу.
Приведем для сведения небольшой фрагмент сложной структуры
иерархии стандартных исключительных ситуаций среды вычислений
Microsoft .NET:
Exception
SystemException
ArithmeticException
DivideByZeroException
OverflowException
...
NullReferenceException
IndexOutOfRangeException
InvalidCastException
...
Заметим, что существует еще более общий уровень иерархии
исключений, чем SystemException, а именно, уровень
Exception.
В данной иерархии исключительных ситуаций перечислены наиболее
типичные неявные исключения: деление на нуль и переполнение как
варианты арифметического исключения.
Другим подклассом исключений являются обращение к пустой ссылке,
выход за границы массива, а также неверный вызов.
Продолжим анализ иерархии исключительных ситуаций среды
вычислений .NET.
ApplicationException
...// специализированные исключения
...
IOException
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
161

FileNotFoundException
DirectoryNotFoundException
...
WebException
...
Отдельный подкласс исключений составляют исключения,
встречающиеся в приложениях.
Еще одним важным подклассом исключительных ситуаций являются
ошибки ввода-вывода, связанные, в частности, с невозможностью
найти файл или каталог.
Наконец, еще одним подклассом исключительных ситуаций,
существенным для среды вычислений Microsoft .NET, ориентированной
на распределенные сетевые вычисления и веб-сервисы, является
подкласс веб-исключений.
Рассмотрим особенности реализации механизма реакции на
исключительные ситуации в языке программирования C# и среде
Microsoft .NET.
Поиск условия обнаружения исключительной ситуации в языке
программирования C# реализован на основе следующего обобщенного
алгоритма.
Осуществляется просмотр цепочки вызовов методов в обратном
направлении до тех пор, пока не будет найден метод с соответствующим
условием обнаружения catch . Если такой метод обнаружить не
удается, программа завершается аварийно и выдается дамп стека
(оперативной памяти).
Подчеркнем, что алгоритм поиска исключительных ситуаций не
обязательно должен результативно завершиться даже для такого
современного и позволяющего создавать относительно безопасный код
языка программирования как C#.
Заметим, что в языке C# не существует различия между помеченными
исключениями, которые необходимо отыскать, и непомеченными
исключениями, в обнаружении которых нет необходимости.
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
162

Несмотря на то, что такой подход в первом приближении
представляется удобным, он заведомо приводит к созданию менее
устойчивого и безопасного прикладного (и тем более системного)
программного кода.
Подводя итоги рассмотрения основных аспектов теории и практики
событийно управляемого программирования на языке C#, можно
сделать следующие выводы.
Во-первых, как и в объектно-ориентированном программировании,
управление событиями (а, другими словами, поведением объектов
программ) открывает возможность моделирования реальных объектов
сколь угодно сложной структуры и природы.
Во-вторых, событийно ориентированное программирование
обеспечивает потенциальную легкость настройки интерфейса
пользователя (и его адаптации в процессе работы программы в
соответствии с требованиями пользователя).
Кроме того, процедуры обработки событий представляют собой методы
в терминологии ООП. Таким образом, основным предметом
программирования являются сценарии, причем методы делегатов,
реализованные в форме скриптов, изменяют состояние программы.
Затем, важным преимуществом программирования, ориентированного
на события или скрипты, является высокий процент повторного
использования программного кода. Заметим, что значительное
количество событий уже реализовано в среде вычислений .NET, и нами
был рассмотрен фрагмент их иерархии.
Далее, необходимо отметить такой позитивный аспект событийного
программирования как гибкость реинжиниринга (т.е. разработки в
обратном направлении) программного обеспечения. По сути, речь идет
о концептуализации, которая является теоретической основой наших
рассуждений.
Именно концептуализация составляет то строгое математическое
основание, которое позволяет не только моделировать управление
событиями, но и обеспечить верифицируемость создаваемого
программного обеспечения.
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
163

Для более подробного самостоятельного ознакомления с тематикой
лекции рекомендуется следующий список источников: [ 24, 28, 36, 66-
69, 79-81].
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
164

Событийно-ориентированное программирование
Цель: ознакомление с особенностями реализации механизмов
событийно-ориентированного программирования в языке C#
(механизм обработки событий, исключительные ситуации).
Теоретические сведения
Обработка событий
Под событием будем понимать автоматическое извещение о каком-либо
действии среды программирования или пользователя. События
являются членами класса и объявляются с использованием ключевого
слова event. Реализация механизма событий в языке
программирования C# основана на использовании делегатов.
Описание события
Синтаксис:
event имя_делегата имя_обьекта;
Широковещательные события
Некоторые события могут активизировать несколько процедур
обработки, в том числе определенных в других объектах. Такие события
называются широковещательными. Реализация механизма
широковещательных событий в языке программирования C# основана
на использовании многоадресных делегатов.
Пример управления событиями посредством делегата:
// Объявление делегата, на основе которого
// будет определено событие.
delegate void MyEventHandler () ;
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
165

// Объявление класса, в котором
// инициируется событие.
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.")
}
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
166

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# реализуется на основе операторных
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
167

блоков try и catch.
Описание блока try и catch
Синтаксис:
try {
Блок_кода_для_которого_выполняется
мониторинг_ошибок}
catch (ExcepTypel ехОb)
{ Обработчик_исключений_ExcepTypel }
catch (ЕхсерТуре2 ехОb)
{Обработчик_исключений_ЕхсерТуре2 }
Основные системные исключения приведены в таблице 10.
Тип исключения в операторе catch должен соответствовать типу
перехватываемого исключения. Неперехваченное исключение
непременно приводит к досрочному прекращению выполнения
программы.
Таблица 10. Основные системные исключения
Исключение Значение
ArrayTypeMismatchException
Тип сохраненного значения
несовместим с типом массива
DivideByZeroException
Предпринята попытка деления
на ноль
IndexOutOfRangeException
Индекс массива выходит за
пределы диапазона
InvalidCastException
Некорректное преобразование в
процессе выполнения
OutOfMemoryException
Вызов new был неудачным из-за
недостатка памяти
Overflow/Exception
Переполнение при выполнении
арифметической операции
StackOverflowException Переполнение стека
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
168

Для выполнения перехвата исключений вне зависимости от их типа
(перехват всех исключений) возможно использование оператора
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 будет вызываться независимо от того, появится
исключение или нет, а также независимо от причин возникновения
такового.
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
169

Генерация исключений
Исключения автоматически генерируются средой программирования.
Однако исключение может быть и явно сгенерировано посредством
оператора throw.
Оператор throw
Синтаксис:
throw exceptOb;
Исключение, перехваченное одним оператором catch, может
генерироваться повторно, и благодаря этому перехватываться внешним
оператором catch. Для этого указывается ключевое слово throw без
имени исключения.
Наследование классов исключений
Можно создавать заказные исключения, выполняющие обработку
ошибок в пользовательском коде. Генерация исключений не
представляет принципиальных сложностей, для этого требуется всего
лишь определить класс, наследуемый из класса Exception. В качестве
общего правила следует руководствоваться тем, что определенные
пользователем исключения наследуются из класса
ApplicationException, так как они представляют собой
иерархию зарезервированных исключений, связанных с приложениями.
Наследуемые классы не нуждаются в фактической реализации в какомлибо виде, поскольку сам факт их существования в системе типов
данных позволяет воспользоваться ими в качестве исключений.
Создаваемые пользователем классы исключений автоматически
получают доступные для них свойства и методы, определенные в
классе Exception.
Введение в теорию программирования. Объектно-ориентированный подходЗыков С. В.
170
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
