C# 4.0 полное руководство - 2011
Шрифт:
Рассмотрим пример программы, в которой используется исключение специального типа. Напомним, что в конце главы 10 был разработан класс RangeArray, поддерживающий одномерные массивы, в которых начальный и конечный индексы определяются пользователем. Так, например, вполне допустимым считается массив, индексируемый в пределах от -5 до 27. Если же индекс выходил за границы массива, то для обработки этой ошибки в классе RangeArray была определена специальная переменная.
массива выполняется более изящным и надежным способом с помощью специально генерируемого исключения.
// Использовать специальное исключение для обработки // ошибок при-обращении к массиву класса RangeArray.
using System;
// Создать исключение для класса RangeArray. class RangeArrayException : Exception {
/* Реализовать все конструкторы класса Exception. Такие конструкторы просто реализуют конструктор базового класса. А поскольку класс исключения RangeArrayException ничего не добавляет к классу Exception, то никаких дополнительных действий не требуется. */ public RangeArrayException : base { }
public RangeArrayException(string str) : base(str) { }
public RangeArrayException(
string str, Exception inner) : base(str, inner) { } protected RangeArrayException(
System.Runtime.Serialization.SerializationInfо si,
System.Runtime.Serialization.StreamingContext sc) : base(si, sc) { }
// Переопределить метод ToStringO для класса исключения RangeArrayException. public override string ToStringO { return Message;
}
}
// Улучшенный вариант класса RangeArray. class RangeArray {
// Закрытые данные.
int[] a; // ссылка на базовый массив int lowerBound; // наименьший индекс int upperBound; // наибольший индекс
// Автоматически реализуемое и доступное только для чтения свойство Length, public int Length { get; private set; }
// Построить массив по заданному размеру public RangeArray(int low, int high) { high++;
if(high <= low) {
throw new RangeArrayException("Нижний индекс не меньше верхнего.");
}
а = new int[high - low];
Length = high - low;
lowerBound = low; upperBound = —high;
}
//
// Это аксессор get. get {
if(ok(index)) {
return a[index - lowerBound];
} else {
throw new RangeArrayException("Ошибка нарушения границ.");
}
}
// Это аксессор set. set {
if(ok(index)) {
a[index - lowerBound] = value;
}
else throw new RangeArrayException("Ошибка нарушения границ."); }
}
// Возвратить логическое значение true, если // индекс находится в установленных границах, private bool ok(int index) {
if(index >= lowerBound & index <= upperBound) return true; return false;
}
}
// Продемонстрировать применение массива с произвольно // задаваемыми пределами индексирования, class RangeArrayDemo { static void Main { try {
RangeArray ra = new RangeArray(-5, 5);
RangeArray ra2 = new RangeArray(1, 10);
i
// Использовать объект га в качестве массива.
Console.WriteLine("Длина массива га: и– + га.Length); for(int i = -5; i <= 5; i++) ra[i] = i;
Console.Write("Содержимое массива ra: "); for (int i = -5; i <= 5; i++)
Console.Write(ra[i] + " ");
Console.WriteLine("\n");
// Использовать объект ra2 в качестве массива.
Console.WriteLine("Длина массива га2: " + ra2.Length); for (int i = 1; i <= 10; i++) ra2[i] = i;
Console.Write("Длина массива ra2: "); for (int i = 1; i <= 10; i++)
Console.Write(ra2[i] + " ");
Console.WriteLine("\n") ;
} catch (RangeArrayException exc) {
Console.WriteLine(exc);
}
// А теперь продемонстрировать обработку некоторых ошибок.
Console.WriteLine("Сгенерировать ошибки нарушения границ.");
// Использовать неверно заданный конструктор, try {
RangeArray гаЗ = new RangeArray(100, -10); // Ошибка!
} catch (RangeArrayException exc) {
Console.WriteLine(exc);
}
// Использовать неверно заданный индекс, try {
RangeArray гаЗ = new RangeArray(-2, 2);