Программирование >>  Обработка исключительных ситуаций 

1 ... 25 26 27 [ 28 ] 29 30 31 ... 142


Глава 4. Операторы

Особенностью базовых конструкций является то, что любая из них имеет только один вход и один выход, поэтому конструкции могут вкладываться друг в друга произвольным образом, например, цикл может содержать следование из двух ветвлений, каждое из которых включает вложенные циклы (рис. 4.6).


Цикл! Цикл!

j j Ветвление j цикл

-nrm-

!

Рис. 4.6. Вложение базовых конструкций

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

В большинстве языков высокого уровня существует несколько реализаций базовых конструкций; в С# есть четыре вида циклов и два вида ветвлений (на два и на произвольное количество направлений). Они введены для удобства программирования, и в каждом случае надо выбирать наиболее подходящие средства. Главное, о чем нужно помнить даже при написании самых простых программ, - они должны состоять из четкой последовательности блоков строго определенной структуры. Кто ясно мыслит, тот ясно излагает - практика давно показала, что программы в стиле поток сознания нежизнеспособны, не говоря о том, что они просто некрасивы.



Обработка исключительных ситуаций

В языке С# есть операторы, позволяющие обнаруживать и обрабатывать ошибки (исключительные ситуации), возникающие в процессе выполнения программы. Об этом уже упоминалось в разделе Введение в исключения (см. с. 46), а сейчас мы рассмотрим механизм обработки исключений более подробно.

Исключительная ситуация, или исключение, - это возникновение аварийного события, которое может порождаться некорректным использованием аппаратуры пли неправильной работой программы, например делением на ноль или переполнением. Обычно эти события приводят к завершению программы с системным сообщением об ошибке. С# дает программисту возможность восстановить работоспособность программы и продолжить ее выполнение.

Исключения С# не поддерживают обработку асинхронных событий, таких как ошибки оборудования или прерывания, например нажатие клавиш Ctrl+C. Механизм исключений предназначен только для событий, которые могут произойти в результате работы самой программы и указываются явным образом. Исключения возникают тогда, когда некоторая часть программы не смогла сделать то, что от нее требовалось. При этом другая часть программы может попытаться сделать что-нибудь иное.

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

Другое достоинство исключений состоит в том, что для передачи информации об ошибке в вызывающую функцию не требуется применять возвращаемое значение или параметры, поэтому заголовки функций не разрастаются.

ПРИМЕЧАНИЕ-

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

Исключения генерирует либо среда выполнения, либо программист с помощью оператора throw. В табл. 4.1 приведены наиболее часто используемые стандартные исключения, генерируемые средой. Они определены в пространстве имен System. Все они являются потомками класса Exception, а точнее, потомками его потомка SystemException.

Исключения обнаруживаются и обрабатываются в операторе try.



Таблица 4.1. Часто используемые стандартные исключения Имя Описание

Ari thmeti cExcepti on Ошибка в арифметических операциях

или преобразованиях (является предком DivideBeZeroException и OverFlowException)

ArrayTypeMi smatchExcepti on Попытка сохранения в массиве элемента несовместимого

тина

Di vi deByZeroExcepti on Попытка деления на ноль

FormatException Попытка передать в метод аргумент неверного формата

IndexOutOfRangeException Индекс массива выходит за границы диапазона

InvalidCastException Ошибка преобразования типа

OutOfMemoryExcepti on Недостаточно памяти для создания нового объекта

OverFlowException Переполнение при выполнении арифметических операций

StackOverR owExcepti on Переполнение стека

Оператор try

Оператор try содержит три части:

контролируемый блок - составной оператор, предваряемый ключевым словом try. В контролируемый блок включаются потенциально опасные операторы программы. Все функции, прямо или косвенно вызываемые из блока, также считаются ему принадлежащими;

один или несколько обработчиков исключений - блоков catch, в которых описывается, как обрабатываются ошибки различных типов;

блок завершения finally выполняется независимо от того, возникла ошибка в контролируемом блоке или нет.

Синтаксис оператора try:

try блок [ блоки catch ] [ блок finally ]

Отсутствовать могут либо блоки catch, либо блок finally, но не оба одновременно.

Рассмотрим, каким образом реализуется обработка исключительных ситуаций.

1. Обработка исключения начинается с появления ошибки. Функция или операция, в которой возникла ошибка, генерирует исключение. Как правило, исключение генерируется не непосредственно в блоке try, а в функциях, прямо или косвенно в него вложенных.

2. Выполнение текущего блока прекращается, отыскивается соответствующий обработчик исключения, и ему передается управление.

3. Выполняется блок final 1у, если он присутствует (этот блок выполняется и в том случае, если ошибка не возникла).



1 ... 25 26 27 [ 28 ] 29 30 31 ... 142

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика