Нижний индекс не меньше верхнего.

Сгенерируем ошибки непопадания в диапазон.

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);

}}}}

Вот результаты выполнения этой программы: