Простейший пример
Простейший пример
Чтобы продемонстрировать "пользу" структурированной обработки исключений, нужно создать тип, который в подходящем окружении может генерировать исключение. Предположим, что мы создали новое консольное приложение с именeм SimpleException, в котором определяются два типа класса Car (автомобиль) и Radio (радио), связанные отношением локализации ("has-a"). Тип Radio определяет один метод, включающий и выключающий радио.
public class Radio {
public void TurnOn(bool on) {
if (on) Console.WriteLine("Радиопомехи…");
else Console.WriteLine ("И тишина…");
}
}
В дополнение к использованию типа Radio в рамках модели локализации/делегирования, тип Car определяет следующее поведение. Если пользователь объекта Car превысит предел для скорости (этот предел задается значением соответствующего члена-константы), то "двигатель взрывается" и объект Car становится непригодным для использования, что выражается в соответствующем изменении значения члена-переменной типа bool с именем carIsDead (автомобиль разрушен). Кроме того, тип Car имеет несколько членов-переменных, представляющих текущую скорость и "ласкательное имя", данное автомобилю пользователем, а также несколько конструкторов. Вот полное определение этого типа (с соответствующими примечаниями).
public class Car {
// Константа для максимума скорости.
public const int maxSpeed = 100;
// Данные внутреннего состояния.
private int currSpeed;
private string petName;
// Работает ли этот автомобиль?
private bool carIsDead;
// В автомобиле есть радио.
private Radio theMusicBox = new Radio();
// Конструкторы.
public Car() {}
public Car(string name, int currSp) {
currSpeed = currSp;
petName = name;
}
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 в действии