Простейший пример

Простейший пример

Чтобы продемонстрировать "пользу" структурированной обработки исключений, нужно создать тип, который в подходящем окружении может генерировать исключение. Предположим, что мы создали новое консольное приложение с имен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 в действии