Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С# и объектно-ориентированное программирование.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.3 Mб
Скачать
    1. Составляющие процесса обработки исключений в .Net

Программирование со структурированной обработкой исключений подразумевает использование четырех следующих связанных между собой сущностей:

  • тип класса, который представляет детали исключения;

  • член, способный генерировать (throw) в вызывающем коде экземпляр класса исключения при соответствующих обстоятельствах;

  • блок кода на вызывающей стороне, ответственный за обращение к члену, в котором может произойти исключение;

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

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

Все определяемые на уровне пользователя и системы исключения в конечном итоге всегда наследуются от базового класса System.Exception, который, в свою очередь, наследуется от класса System. Object. В таблице 2 приведен перечень наиболее интересных свойств класса Exception.

Свойство

Назначение

Data

Это свойство, доступное только для чтения, позволяет извлекать коллекцию пар "ключ/значение" (представленную объектом, реализующим интерфейс iDictionary), которая предоставляет дополнительную определяемую программистом информацию об исключении. По умолчанию эта коллекция является пустой.

HelpLink

Это свойство позволяет получать или устанавливать URL-адрес, по которому доступен справочный файл или веб-сайт с детальным описанием ошибки.

Message

Это свойство, доступное только для чтения, возвращает текстовое описание соответствующей ошибки. Само сообщение об ошибке задается в передаваемом конструктору параметре.

Source

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

StackTrace

Это свойство, доступное только для чтения, содержит строку с описанием

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

TargetSite

Это свойство, доступное только для чтения, возвращает объект MethodBase с описанием многочисленных деталей метода, который привел к выдаче исключения (вызов вместе с ним ToString() позволяет идентифицировать этот метод по имени).

InnerExeption

Это свойство, доступное только для чтения, может применяться для получения информации о предыдущем исключении или исключениях, которые послужили причиной возникновения текущего исключения. Запись предыдущих исключений осуществляется путем их передачи конструктору самого последнего исключения.

    1. Генерация общего исключения

Чтобы продемонстрировать использование System.Exception, обратимся к проекту CarExample а точнее к методу SpeedUp() класса Саг.

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

Для изменения этого метода так, чтобы при попытке разогнать автомобиль до скорости, превышающий установленный в классе Саг предел, генерировалось исключение, потребуется создать и сконфигурировать новый экземпляр класса System.Exception и установить значение доступного только для чтения свойства Message через конструктор класса. Чтобы объект ошибки отправлялся обратно вызывающей стороне, в С# используется ключевое слово throw.

(этот код вставляем в проект CarExample, в класс Car)

Задание!!!: протестировать, исправить возможные ошибки

Прежде чем переходить к рассмотрению перехвата данного исключения в вызывающем коде, необходимо отметить несколько интересных моментов. При генерации исключения то, как будет выглядеть ошибка и когда она должна выдаваться, решает программист. В рассматриваемом примере предполагается, что при попытке увеличить скорость автомобиля (объекта Саг), который уже вышел из строя, должен генерироваться объект System.Exception для уведомления о том, что метод SpeedUp() не может быть продолжен (это предположение может оказаться как подходящим, так и нет, в зависимости от создаваемого приложения).

В качестве альтернативы метод SpeedUp() можно было бы реализовать и так, чтобы он производил автоматическое восстановление, не выдавая перед этим никакого исключения. По большому счету, исключения должны генерироваться только в случае возникновения более критичных условий (например, отсутствии нужного файла, невозможности подключиться к базе данных и т.п.). Принятие решения о том, что должно служить причиной генерации исключения, требует серьезного продумывания и поиска веских оснований на стадии проектирования. Для преследуемых сейчас целей давайте считать, что попытка увеличить скорость неисправного автомобиля является вполне оправданной причиной для выдачи исключения.