Нижний индекс не меньше верхнего.
Сгенерируем ошибки непопадания в диапазон.
Console.WriteLine(
Else throw new RangeArrayException(
Throw new RangeArrayException(
Throw new RangeArrayException(
"Нижний индекс не меньше верхнего."),
}
а = new int[high - low];
len = high - low;
lowerBound = low;
upperBound = --high;
}
// Свойство Length, предназначенное только для чтения,
public int Length {
get {
return len;
}}
// Индексатор для объекта класса RangeArray.
public int this[int index] {
// Средство для чтения элемента массива,
get {
if(ok(index)) {
return a[index - lowerBound];
} else {
"Ошибка нарушения границ диапазона.");
}}
// Средство для записи элемента массива.-
set {
if(ok(index)) {
a[index - lowerBound] = value;
}
"Ошибка нарушения границ диапазона.");
}}
// Метод возвращает значение true,
// если индекс в пределах диапазона,
private bool ok(int index) {
if(index >= lowerBound & index <= upperBound)
returntrue;
returnfalse;
}}
// Демонстрируем использование массива с заданным
// диапазоном изменения индекса,
classRangeArrayDemo {
public static void Main() {
try {
RangeArray ra = new RangeArray(-5, 5);
RangeArrayra2 = newRangeArray(1, 10);
// Демонстрируем использование объекта-массива га.
Console.WriteLine("Длина массива га: " + ra.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("Длина массива ra2: " + 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);
}
// Теперь демонстрируем "работу над ошибками".
"Сгенерируем ошибки непопадания в диапазон.");
// Используем неверно заданный конструктор,
try {
RangeArray ra3= new RangeArray(100, -10); // Ошибка!
} catch (RangeArrayException exc) {
Console.WriteLine(exc);
}
// Используем неверно заданный индекс,
try {
RangeArray ra3 = new RangeArray(-2, 2);
for(int i = -2; i <= 2; i++)
гаЗ [i] = i;
Console.Write("Содержимое массива ra3: " ) ;
for(int i = -2; i <= 10; i++) // Ошибка непопадания
// в диапазон.
Console.Write(ra3[i] + " " ) ;
} catch (RangeArrayException exc){
Console.WriteLine(exc);
}}
При выполнении этой программы получаем такие результаты:
Длина массиваra: 11
Содержимое массива ra: - 5 - 4 - 3 - 2 - 1 0 1 2 3 4 5
Длина массива ra2: 10
С о д е р ж и м о е м а с с и в а ra2 : 1 2 3 4 5 6 7 8 9 1 0
Содержимое массива raЗ: - 2 - 1 0 1 2 Ошибка нарушения границ диапазона.
При возникновении ошибки нарушения границ диапазона RangeArray-объект генерирует объект типа RangeArrayException. Этот класс — производный от классаApplicationException. Класс исключений, создаваемыйпрограммистом, обычно выводится из класса ApplicationException. Обратите внимание на то, что подобная ошибка может обнаружиться во время созданияRangeArray-объекта. Чтобы перехватывать такие исключения, объекты классаRange Array должны создаваться внутри блока try, как это показано в программе. Сиспользованием исключений для сообщений об ошибках класс RangeArray теперьнапоминает один из встроенных С#-типов и может быть полностью интегрирован вмеханизм обработки исключений любой программы.
7.10 Перехват исключений производных классов
При перехвате исключений, типы которых включают базовые и производные классы, необходимо обращать внимание на порядок catch-инструкций, поскольку catch-инструкция для базового класса соответствует любой catch-инструкции производных классов. Например, поскольку базовым классом для всех исключений является Exception, при перехвате исключения типа Exception будут перехватываться все возможные исключения. Конечно, использование catch-инструкции без аргумента обеспечивает более ясный способ перехвата всех исключений. Однако проблема перехвата исключений производных классов очень важна в других контекстах, особенно в случае создания собственных классов исключений.
Если нужно перехватывать исключения и базового, и производного класса, поместите первой в catch-последовательности инструкцию с заданием производного класса. В противном случае catch-инструкция с заданием базового класса будет перехватывать все исключения производных классов. Это правило — вынужденная мера, поскольку размещение catch-инструкции для базового класса перед остальными catch-инструкциями сделает их недостижимыми, и они никогда не будут выполнены. В С# недостижимая catch-инструкция считается ошибкой.
Следующая программа создает два класса исключений с именами ExceptA и ExceptB. Класс ExceptA выводится из класса ApplicationException, а класс ExceptB — из класса ExceptA. Затем программа генерирует исключение каждого типа.
// Инструкции перехвата исключений производных классов
// должны стоять перед инструкциями перехвата исключений
// базовых классов.
usingSystem;
// Создаем класс исключения.
class ExceptA : ApplicationException {
public ExceptA() : base() { }
public ExceptA(string str) : base(str) { }
public override string ToStringO {
return Message;
}}
// Создаем класс исключения как производный
// от класса ExceptA.
class ExceptB : ExceptA {
public ExceptB() : base() { }
public ExceptB(string str) : base(str) { }
public override string ToStringO {
return Message;
}}
class OrderMatters {
public static void Main() {
for(int x = 0; x < 3; x++) {
try {
if(x==0) throw new ExceptA(
"Перехват исключения типа ExceptA.");
else if(x==l) throw new ExceptB(
"Перехват исключения типа ExceptB.");
else throw new ExceptionO;
}
catch (ExceptBexc) {
// Перехватываем исключение.
Console.WriteLine(exc);
}
catch (ExceptAexc) {
// Перехватываем исключение.
Console.WriteLine(exc);
}
catch (Exception exc) {
Console.WriteLine(exc);
}}}}
Вот результаты выполнения этой программы: