}
public void CrankTunes(bool state) {
// Запрос делегата для внутреннего объекта.
theMusicBox.TurnOn(state);
} // He перегрелся ли автомобиль?
public void Accelerate(int delta) {
if (carIsDead) Console.WriteLine("{0} не работает…", petName);
else {
currSpeed += delta;
if (currSpeed › maxSpeed) {
Console.WriteLine("{0} перегрелся!", petName);
currSpeed = 0; carIsDead = true;
} else Console.WriteLine("=› currSpeed = {0}", currSpeed);
}
}
}
Теперь реализуем такой метод Main(), в котором объект Car превысит заданную максимальную скорость (представленную) константой maxSpeed).
static void Main(string[] args) {
Console.WriteLine("*** Создание и испытание автомобиля ***");
Car myCar = new Car("Zippy", 20);
myCar.CrankTunes(true);
for (int i = 0; i ‹ 10; i++) myCar.Accelerate(10);
Console.ReadLine();
}
Тогда мы увидим вывод, подобный показанному на рис. 6.1.
Рис. 6.1. Объект Car в действии
Теперь, когда тип Car функционирует, продемонстрируем простейший способ генерирования исключений. Текущая реализация Accelerate() выводит сообщение об ошибке, когда значение скорости объекта Car становится выше заданного предела.
Модифицируем этот метод так, чтобы он генерировал исключение при попытке пользователя увеличить скорость автомобиля выше предусмотренных его создателем пределов. Для этого нужно создать и сконфигурировать экземпляр класса System.Exception, установив значение доступного только для чтения свойства Message с помощью конструктора класса. Чтобы отправить соответствующий ошибке объект вызывающей стороне, используйте ключевое слово C# throw. Вот как может выглядеть соответствующая модификация метода Accelerate().
// Теперь, если пользователь увеличит скорость выше maxSpeed,
// генерируется исключение.
public void Accelerate(int delta) {
if (carIsDead) Console.WriteLine("{0} не работает…", petName);
else {
currSpeed += delta;
if (currSpeed ›= maxSpeed) {
carIsDead = true;
currSpeed = 0;
// Используйте ключевое слово "throw",
// чтобы генерировать исключение.
throw new Exception(string.Format("{0} перегрелся!", petName));
} else Console.WriteLine("=› CurrSpeed = {0}', currSpeed);
}
}
Прежде чем выяснить, как вызывающая сторона должна обрабатывать это исключение, отметим несколько интересных моментов. Во-первых, при генерировании исключения только от вас зависит, что следует считать исключительной ситуацией и когда должно быть сгенерировано соответствующее исключение. Здесь мы предполагаем, что при попытке в программе увеличить скорость автомобиля, который уже перестал функционировать, должен генерироваться тип System.Exception, сообщающий, что метод Accelerate() не может продолжить свою работу.
В качестве альтернативы можно реализовать такой метод Accelerate(), который автоматически выполнит восстановление без генерирования исключения. Вообще говоря, исключения должны генерироваться только тогда, когда выявляются экстремальные ситуации (например, не найден необходимый файл, нет возможности соединиться с базой данных и т.п.). Решение о том, что именно должно вызывать появление исключений, должно приниматься разработчиком, и вы, как разработчик, должны всегда помнить об этом. Для наших примеров мы предполагаем, что увеличение скорости нашего обреченного автомобиля выше допустимого предела является вполне серьезной причиной для генерирования исключения.
Ввиду того, что теперь метод Accelerate() может генерировать исключение, вызывающая сторона должна быть готова обработать такое исключение. При вызове метода, способного генерировать исключение, вы должны использовать блок try/catch. Приняв исключение, вы можете вызвать члены типа System.Exception и прочитать подробную информацию о проблеме. Что вы будете делать с полученными данными, зависит, в основном, от вас. Вы можете поместить соответствующую информацию в файл отчета, записать ее в журнал регистрации событий Windows, отправить ее по электронной почте администратору системы или показать сообщение с описанием проблемы конечному пользователю. Здесь мы просто выводим информацию в окно консоли.
// Обработка сгенерированного исключения.
static void Main(string[] args) {
Console.WriteLine("*** Создание и испытание автомобиля ***");
Читать дальше