Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Ответы по Технологии программирования / Наследование классов исключений

.docx
Скачиваний:
8
Добавлен:
21.05.2015
Размер:
9.15 Кб
Скачать

В С# имеется возможность обрабатывать исключения, создаваемые программистом. В своих программах вы можете использовать для обработки ошибок "собственные" исключения. Для этого достаточно определить класс как производный от класса Exception. Как правило, определяемые программистом исключения, должны быть производными от класса ApplicationException, "родоначальника" иерархии, зарезервированной для исключений, связанных с прикладными программами. Созданные вами производные классы не должны ничего реализовывать, поскольку одно лишь их существование в системе типов уже позволит использовать их в качестве исключений.

Классы исключений, создаваемые программистом, будут автоматически иметь свойства и методы, определенные в классе Exception и доступные для них. Конечно, один или несколько членов в новых классах можно переопределить.

// Создание пользовательского исключения для

// обнаружения ошибок при работе с объектами класса

// RangeArray.

using System;

// Создаем исключение для класса RangeArray.

class RangeArrayException : ApplicationException {

// Реализуемстандартныеконструкторы,

public RangeArrayException() : base() { }

public RangeArrayException(string str) : base(str) { }

// Переопределяемметод ToString()длякласса

// RangeArrayException.

public override string ToString() {

return Message;

}}

// Улучшенная версия класса RangeArray.

class RangeArray {

// Закрытые данные.

int[] а; // Ссылка на базовый массив.

intlowerBound; // Наименьший индекс.

intupperBound; // Наибольший индекс.

intlen; // Базовая переменная для свойства Length.

// Создаем массив с заданным размером,

public RangeArray(int low, int high) {

high++;

if(high <= low) {

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 {

throw new RangeArrayException(

"Ошибка нарушения границ диапазона.");

}}

// Средство для записи элемента массива.-

set {

if(ok(index)) {

a[index - lowerBound] = value;

}

else throw new RangeArrayException(

"Ошибка нарушения границ диапазона.");

}}

// Метод возвращает значение 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);

}

// Теперь демонстрируем "работу над ошибками".

Console.WriteLine(

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

// Используем неверно заданный конструктор,

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 теперьнапоминает один из встроенных С#-типов и может быть полностью интегрирован вмеханизм обработки исключений любой программы.