Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка ООП C#.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
13.94 Mб
Скачать

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

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

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

Перехват исключений

Поскольку теперь метод Accelerate() способен генерировать исключение, вызывающий код должен быть готов обработать его, если оно вдруг возникнет. При вызове метода, который может генерировать исключение, должен использоваться блок try/catch. После перехвата объекта исключения можно обращаться к различным его членам и извлекать детальную информацию о проблеме. Что делать с этими деталями дальше в основном зависит от вас. Может быть решено зафиксировать их в специальном файле отчета, записать в журнал событий Windows, отправить по электронной почте системному администратору или отобразить конечному пользователю. Для простоты мы выведем детали исключения в окне консоли.

По сути, блок try представляет собой раздел операторов, которые в ходе выполнения могут генерировать исключение. Если исключение обнаруживается, управление переходит к соответствующему блоку catch. С другой стороны, в случае, если код внутри блока try не приводит к генерации исключения, блок catch полностью пропускается, и все проходит гладко. Ниже представлен вывод в результате тестового запуска данной программы.

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