ВУЗ:
Составители:
Рубрика:
22
В рассматриваемой нами модели исключения являются объектами, класс
которых представляет собой наследника класса Exception. Этот класс и много-
численные его наследники является частью библиотеки FCL, хотя и разбросаны
по разным пространствам имен. Каждый класс задает определенный тип ис-
ключения в соответствии с классификацией, принятой в Framework .Net. Вот
лишь некоторые классы исключений из пространства имен System:
ArgumentException, ArgumentOutOfRangeException, ArithmeticException, BadImage-
FormatException, DivideByZeroException, OverflowException. В пространстве имен
System.IO собраны классы исключений, связанных с проблемами ввода-вывода:
DirectoryNotFoundException, FileNotFoundException и многие другие. Имена всех
классов исключений заканчиваются словом Exception. Разрешается создавать
собственные классы исключений, наследуя их от класса Exception.
При выполнении оператора throw создается объект te, класс TE которого
характеризует текущее исключение, а поля содержат информацию о возникшей
исключительной ситуации. Выполнение оператора throw приводит к тому, что
нормальный процесс вычислений на этом прекращается. Если это происходит в
охраняемом try-блоке, то начинается этап «захвата» исключения одним из об-
работчиков исключений.
Захват исключения
Блок catch – обработчик исключения имеет следующий синтаксис:
catch (T e) {...}
Класс T, указанный в заголовке catch-блока, должен принадлежать клас-
сам исключений. Блок catch с формальным аргументом e класса T потенциально
способен захватить текущее исключение te класса TE, если и только если объект
te совместим по присваиванию с объектом e. Другими словами, потенциальная
способность захвата означает допустимость присваивания e = te, что возможно,
когда класс TE является потомком класса T. Обработчик, класс T которого явля-
ется классом Exception, является универсальным обработчиком, потенциально
он способен захватить любое исключение, поскольку все они являются его по-
томками.
Потенциальных захватчиков может быть много, исключение захватывает
лишь один – тот из них, кто стоит первым в списке проверки. Каков порядок
проверки? Он довольно естественный. Вначале проверяются обработчики в по-
рядке следования их за try-блоком, и первый потенциальный захватчик стано-
вится активным, захватывая исключение и выполняя его обработку. Отсюда
становится ясно, что порядок следования в списке catch-блоков крайне важен.
Первыми идут наиболее специализированные обработчики, далее по мере воз-
растания универсальности. Так, вначале должен идти обработчик исключения
DivideByZeroException, а уже за ним – ArithmeticException. Универсальный обра-
ботчик, если он есть, должен стоять последним. За этим наблюдает статический
контроль типов. Если потенциальных захватчиков в списке catch-блоков нет
(сам список может отсутствовать), то происходит переход к списку обработчи-
Страницы
- « первая
- ‹ предыдущая
- …
- 20
- 21
- 22
- 23
- 24
- …
- следующая ›
- последняя »