Чтение онлайн

на главную - закладки

Жанры

C# 4.0 полное руководство - 2011

Шилдт Герберт

Шрифт:

for(int i = -2; i <= 2; i++) ra3[i] = i;

Console.Write("Содержимое массива гаЗ: ");

for (int i = -2; i <= 10; i++) // сгенерировать ошибку нарушения границ Console.Write(гаЗ[i] + " ");

} catch (RangeArrayException exc) {

Console.WriteLine(exc);

}

}

}

После выполнения этой программы получается следующий результат.

Длина массива га: 11

Содержимое массива га: -5-4-3-2-1012345 Длина массива га2: 10

Содержимое массива га2: 12345678910

Сгенерировать

ошибки нарушения границ.

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

Содержимое массива гаЗ: -2-1012 Ошибка нарушения границ.

Когда возникает ошибка нарушения границ массива класса RangeArray, генерируется объект типа RangeArrayException. В классе RangeArray это может произойти в трех следующих местах: в аксессоре get индексатора, в аксессоре set индексатора и в конструкторе класса RangeArray. Для перехвата этих исключений подразумевается, что объекты типа RangeArray должны быть сконструированы и доступны из блока try, что и продемонстрировано в приведенной выше программе. Используя специальное исключение для сообщения об ошибках, класс RangeArray теперь действует как один из встроенных в C# типов данных, и поэтому он может быть полностью интегрирован в механизм обработки ошибок, обнаруживаемых в программе.

Обратите внимание на то, что в теле конструкторов класса исключения RangeArrayException отсутствуют какие-либо операторы, но вместо этого они просто передают свои аргументы классу Exception, используя ключевое слово base. Как пояснялось ранее, в тех случаях, когда производный класс исключений не дополняет функции базового класса, весь процесс создания исключений можно поручить конструкторам класса Exception. Ведь производный класс исключений совсем не обязательно должен чем-то дополнять функции, наследуемые от класса Exception.

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

Перехват исключений производных классов

При попытке перехватить типы исключений, относящихся как к базовым, так и к производным классам, следует особенно внимательно соблюдать порядок следования операторов catch, поскольку перехват исключения базового класса будет совпадать с перехватом исключений любых его производных классов. Например, класс Exception является базовым для всех исключений, и поэтому вместе с исключением типа Exception могут быть перехвачены и все остальные исключения производных от него классов. Конечно, для более четкого перехвата всех исключений можно воспользоваться упоминавшейся ранее формой оператора catch без указания конкретного типа исключения. Но вопрос перехвата исключений производных классов становится весьма актуальным и в других ситуациях, особенно при создании собственных исключений.

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

Это правило необходимо соблюдать потому, что при перехвате исключения базового класса будут также перехвачены исключения всех производных от него классов. Правда, это правило соблюдается автоматически: если первым расположить в коде оператор
catch, перехватывающий исключение базового класса, то во время компиляции этого кода будет выдано сообщение об ошибке.

В приведенном ниже примере программы создаются два класса исключений: ExceptA и ExceptB. Класс ExceptA является производным от класса Exception, а класс ExceptB — производным от класса ExceptA. Затем в программе генерируются исключения каждого типа. Ради краткости в классах специальных исключений предоставляется только один конструктор, принимающий символьную строку, описывающую исключение. Но при разработке программ коммерческого назначения в классах специальных исключений обычно требуется предоставлять все четыре конструктора, определяемых в классе Exception.

// Исключения производных классов должны появляться до // исключений базового класса.

using System;

// Создать класс исключения, class ExceptA : Exception {

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

public override string ToStringO { return Message;

}

}

// Создать класс исключения, производный от класса ExceptA. class ExceptB : ExceptA {

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

public override string ToStringO { return Message;

}

}

class OrderMatters { 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 Exception;

}

catch (ExceptB exc) {

Console.WriteLine(exc);

}

catch (ExceptA exc) {

Console.WriteLine(exc);

}

catch (Exception exc) {

Console.WriteLine(exc);

}

}

}

}

Вот к какому результату приводит выполнение этой программы.

Перехват исключения типа ExceptA.

Перехват исключения типа ExceptB.

System.Exception: Выдано исключение типа "System.Exception".

в OrderMatters.Main в <имя_файла>:строка 3 6

Обратите внимание на порядок следования операторов catch. Именно в таком порядке они и должны выполняться. Класс ExceptB является производным от класса ExceptA, поэтому исключение типа ExceptB должно перехватываться до исключения типа ExceptA. Аналогично, исключение типа Exception (т.е. базового класса для всех исключений) должно перехватываться последним. Для того чтобы убедиться в этом, измените порядок следования операторов catch. В итоге это приведет к ошибке во время компиляции.

Поделиться:
Популярные книги

Warhammer 40000: Ересь Хоруса. Омнибус. Том II

Хейли Гай
Фантастика:
эпическая фантастика
5.00
рейтинг книги
Warhammer 40000: Ересь Хоруса. Омнибус. Том II

Зауряд-врач

Дроздов Анатолий Федорович
1. Зауряд-врач
Фантастика:
альтернативная история
8.64
рейтинг книги
Зауряд-врач

Избранное. Компиляция. Книги 1-11

Пулман Филип
Фантастика:
фэнтези
героическая фантастика
5.00
рейтинг книги
Избранное. Компиляция. Книги 1-11

Титан империи

Артемов Александр Александрович
1. Титан Империи
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Титан империи

Курсант: Назад в СССР 7

Дамиров Рафаэль
7. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Курсант: Назад в СССР 7

Хозяйка старой усадьбы

Скор Элен
Любовные романы:
любовно-фантастические романы
8.07
рейтинг книги
Хозяйка старой усадьбы

Неправильный боец РККА Забабашкин 3

Арх Максим
3. Неправильный солдат Забабашкин
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Неправильный боец РККА Забабашкин 3

Герцог и я

Куин Джулия
1. Бриджертоны
Любовные романы:
исторические любовные романы
8.92
рейтинг книги
Герцог и я

Я тебя верну

Вечная Ольга
2. Сага о подсолнухах
Любовные романы:
современные любовные романы
эро литература
5.50
рейтинг книги
Я тебя верну

Вамп

Парсиев Дмитрий
3. История одного эволюционера
Фантастика:
рпг
городское фэнтези
постапокалипсис
5.00
рейтинг книги
Вамп

Школа. Первый пояс

Игнатов Михаил Павлович
2. Путь
Фантастика:
фэнтези
7.67
рейтинг книги
Школа. Первый пояс

Цеховик. Книга 1. Отрицание

Ромов Дмитрий
1. Цеховик
Фантастика:
попаданцы
альтернативная история
5.75
рейтинг книги
Цеховик. Книга 1. Отрицание

Сочинения в двух томах. том 1

Фаррер Клод
Приключения:
исторические приключения
прочие приключения
5.00
рейтинг книги
Сочинения в двух томах. том 1

Тайный наследник для миллиардера

Тоцка Тала
Любовные романы:
современные любовные романы
5.20
рейтинг книги
Тайный наследник для миллиардера