
- •С# и объектно-ориентированное программирование. Содержание
- •Разбор простой программы на с#.
- •Варианты метода Main ()
- •Формальное определение класса в с#
- •2.1Ссылки на самого себя
- •Построение цепочки вызовов конструкторов с использованием this.
- •Модификаторы доступа с#
- •Средства инкапсуляции с#
- •Инкапсуляция с использованием традиционных методов доступа и изменения
- •Инкапсуляция с использованием свойств .Net
- •Свойства, доступные только для чтения и только для записи
- •Статические свойства
- •Статические конструкторы
- •Наследование в с#
- •Работа с конструктором базового класса
- •Множественное наследование.
- •Ключевое слово sealed
- •Поддержка полиморфизма в с#
- •Ключевые слова virtual и override
- •Абстрактные классы
- •Полиморфный интерфейс
- •Сокрытие методов
- •Правила приведения к базовому и производному классу
- •Ключевое слово as
- •Ключевое слово is
- •Применение модели включения – делегирования.
- •Определение вложенных типов
- •Обработка исключений
- •Роль обработки исключений в .Net
- •Составляющие процесса обработки исключений в .Net
- •Генерация общего исключения
- •Перехват исключений
- •Создание специальных исключений, способ первый
- •Обработка нескольких исключений.
- •Блок finally
- •Замечания по работе с исключениями
- •Время жизни объектов
- •Базовые сведения о времени жизни объектов
- •Роль корневых элементов приложения
- •Поколения объектов
- •Параллельная сборка мусора в версиях .Net 1.0 - .Net 3.5
- •Фоновая сборка мусора в версии .Net 4.0
- •Создание финализируемых объектов
- •Описание процесса финализации
- •Создание высвобождаемых объектов
- •Повторное использование ключевого слова using в с#
- •Взаимодействие со сборщиком мусора
- •Принудительная активизация сборки мусора
- •Создание финализируемых и высвобождаемых типов
- •Формализованный шаблон очистки
Составляющие процесса обработки исключений в .Net
Программирование со структурированной обработкой исключений подразумевает использование четырех следующих связанных между собой сущностей:
тип класса, который представляет детали исключения;
член, способный генерировать (throw) в вызывающем коде экземпляр класса исключения при соответствующих обстоятельствах;
блок кода на вызывающей стороне, ответственный за обращение к члену, в котором может произойти исключение;
блок кода на вызывающей стороне, который будет обрабатывать (или перехватывать (catch)) исключение в случае его возникновения.
При генерации и обработке исключений в С# используются четыре ключевых слова (try, catch, throw и finally).
Все определяемые на уровне пользователя и системы исключения в конечном итоге всегда наследуются от базового класса System.Exception, который, в свою очередь, наследуется от класса System. Object. В таблице 2 приведен перечень наиболее интересных свойств класса Exception.
Свойство |
Назначение |
Data |
Это свойство, доступное только для чтения, позволяет извлекать коллекцию пар "ключ/значение" (представленную объектом, реализующим интерфейс iDictionary), которая предоставляет дополнительную определяемую программистом информацию об исключении. По умолчанию эта коллекция является пустой. |
HelpLink |
Это свойство позволяет получать или устанавливать URL-адрес, по которому доступен справочный файл или веб-сайт с детальным описанием ошибки. |
Message |
Это свойство, доступное только для чтения, возвращает текстовое описание соответствующей ошибки. Само сообщение об ошибке задается в передаваемом конструктору параметре. |
Source |
Это свойство позволяет получать или устанавливать имя сборки или объекта, который привел к выдаче исключения. |
StackTrace |
Это свойство, доступное только для чтения, содержит строку с описанием последовательности вызовов, которая привела к возникновению исключения. Как нетрудно догадаться, это свойство очень полезно во время отладки или для сохранения информации об ошибке во внешнем журнале ошибок. |
TargetSite |
Это свойство, доступное только для чтения, возвращает объект MethodBase с описанием многочисленных деталей метода, который привел к выдаче исключения (вызов вместе с ним ToString() позволяет идентифицировать этот метод по имени). |
InnerExeption |
Это свойство, доступное только для чтения, может применяться для получения информации о предыдущем исключении или исключениях, которые послужили причиной возникновения текущего исключения. Запись предыдущих исключений осуществляется путем их передачи конструктору самого последнего исключения. |
Генерация общего исключения
Чтобы продемонстрировать использование System.Exception, обратимся к проекту CarExample а точнее к методу SpeedUp() класса Саг.
Имея функционирующий класс Саг, давайте рассмотрим простейший способ генерации исключения. Текущая реализация метода SpeedUp() предусматривает просто отображение сообщения об ошибке, когда предпринимается попытка разогнать автомобиль (объект Саг) до скорости, превышающей максимальный предел.
Для изменения этого метода так, чтобы при попытке разогнать автомобиль до скорости, превышающий установленный в классе Саг предел, генерировалось исключение, потребуется создать и сконфигурировать новый экземпляр класса System.Exception и установить значение доступного только для чтения свойства Message через конструктор класса. Чтобы объект ошибки отправлялся обратно вызывающей стороне, в С# используется ключевое слово throw.
(этот код вставляем в проект CarExample, в класс Car)
Задание!!!: протестировать, исправить возможные ошибки
Прежде чем переходить к рассмотрению перехвата данного исключения в вызывающем коде, необходимо отметить несколько интересных моментов. При генерации исключения то, как будет выглядеть ошибка и когда она должна выдаваться, решает программист. В рассматриваемом примере предполагается, что при попытке увеличить скорость автомобиля (объекта Саг), который уже вышел из строя, должен генерироваться объект System.Exception для уведомления о том, что метод SpeedUp() не может быть продолжен (это предположение может оказаться как подходящим, так и нет, в зависимости от создаваемого приложения).
В качестве альтернативы метод SpeedUp() можно было бы реализовать и так, чтобы он производил автоматическое восстановление, не выдавая перед этим никакого исключения. По большому счету, исключения должны генерироваться только в случае возникновения более критичных условий (например, отсутствии нужного файла, невозможности подключиться к базе данных и т.п.). Принятие решения о том, что должно служить причиной генерации исключения, требует серьезного продумывания и поиска веских оснований на стадии проектирования. Для преследуемых сейчас целей давайте считать, что попытка увеличить скорость неисправного автомобиля является вполне оправданной причиной для выдачи исключения.