Автор: Пользователь скрыл имя, 01 Декабря 2011 в 12:29, доклад
Исключительная ситуация, или исключение, — это возникновение аварийного события, которое может порождаться некорректным использованием аппаратуры или неправильной работой программы, например, делением на ноль или переполнением. Обычно эти события приводят к завершению программы с системным сообщением об ошибке. Но языки программирования дают нам возможность восстановить работоспособность программы и продолжить ее выполнение.
ГЕНЕРАЦИЯ
И ОБРАБОТКА ИСКЛЮЧЕНИЙ
Исключительная ситуация, или исключение, — это возникновение аварийного события, которое может порождаться некорректным использованием аппаратуры или неправильной работой программы, например, делением на ноль или переполнением. Обычно эти события приводят к завершению программы с системным сообщением об ошибке. Но языки программирования дают нам возможность восстановить работоспособность программы и продолжить ее выполнение.
Обработка исключительных ситуаций (англ. exception handling) — механизм языков программирования, предназначенный для описания реакции программы на ошибки времени выполнения и другие возможные проблемы (исключения), которые могут возникнуть при выполнении программы и приводят к невозможности (бессмысленности) дальнейшей отработки программой её базового алгоритма. В русском языке также применяется более короткая форма термина: «обработка исключений».
Классические примеры исключений:
Исключительные ситуации, возникающие при работе программы, можно разделить на два основных типа: синхронные и асинхронные, принципы реакции на которые существенно различаются.
В отсутствие собственного механизма обработки исключений для прикладных программ наиболее общей реакцией на любую исключительную ситуацию является немедленное прекращение выполнения с выдачей пользователю сообщения о характере исключения. Можно сказать, что в подобных случаях единственным и универсальным обработчиком исключений становится операционная система. Например, в операционную систему Windows встроена утилита Dr. Watson, которая занимается сбором информации об необработанном исключении и ее отправкой на специальный сервер компании Microsoft.
Возможно игнорирование исключительной ситуации и продолжение работы, но такая тактика опасна, так как приводит к ошибочным результатам работы программ или возникновению ошибок впоследствии. Например, проигнорировав ошибку чтения из файла блока данных, программа получит в своё распоряжение не те данные, которые она должна была считать, а какие-то другие. Результаты их использования предугадать невозможно.
Обработка исключительных ситуаций самой программой заключается в том, что при возникновении исключительной ситуации управление передаётся некоторому заранее определённомуобработчику — блоку кода, процедуре, функции, которые выполняют необходимые действия.
Существует два принципиально разных механизма функционирования обработчиков исключений.
Исключения
генерирует либо среда выполнения,
либо программист с помощью
Таблица 1.1 - Часто используемые стандартные исключения
Имя | Описание |
DivideByZeroException | Попытка деления на ноль |
FormatException | Попытка передать в метод аргумент неверного формата |
IndexOutOfRangeException | Индекс массива выходит за границы диапазона |
InvalidCastException | Ошибка преобразования типа |
OutOfMemoryException | Недостаточно памяти для создания нового объекта |
OverFlowException | Переполнение при выполнении арифметических операций |
StackOverFlowException | Переполнение стека |
Исключения обнаруживаются и обрабатываются в операторе try.
Оператор try содержит три части:
Отсутствовать могут либо блоки catch, либо блок finally, но не оба одновременно.
Обработчики исключений должны располагаться непосредственно за блоком try. Они начинаются с ключевого слова catch, за которым в скобках следует тип обрабатываемого исключения. Можно записать один или несколько обработчиков в соответствии с типами обрабатываемых исключений.
Если исключение в контролируемом блоке не возникло, все обработчики пропускаются.
В любом случае, произошло исключение или нет, управление передается в блок завершения finally (если он существует), а затем — первому оператору, находящемуся непосредственно за оператором try.
Операторы try могут многократно вкладываться друг в друга. Исключение, которое возникло во внутреннем блоке try и не было перехвачено соответствующим блоком catch, передается на верхний уровень, где продолжается поиск подходящего обработчика. Этот процесс называется распространением исключения.
Рассмотрим,
каким образом реализуется
До
сих пор мы рассматривали исключения,
которые генерирует среда выполнения
C#, но это может сделать и сам
программист. Для генерации исключения
используется оператор throw с параметром,
определяющим вид исключения. Параметр
должен быть объектом, порожденным от
стандартного класса System.Exception. Этот объект
используется для передачи информации
об исключении его обработчику.
Синтаксис оператора throw:
throw [ выражение ];
Форма
без параметра применяется
throw new DivideByZeroException();
Здесь после слова throw записано выражение, создающее объект стандартного класса «ошибка при делении на 0» с помощью операции new.
При генерации исключения выполнение текущего блока прекращается и происходит поиск соответствующего обработчика с передачей ему управления. Обработчик считается найденным, если тип объекта, указанного после throw, либо тот же, что задан в параметре catch, либо является производным от него.
Класс Exception содержит несколько полезных свойств, с помощью которых можно получить информацию об исключении.
Таблица 1.2 – Свойства класса Exception
Свойство | Описание |
HelpLink | URL файла справки с описанием ошибки |
Message | Текстовое описание ошибки. Устанавливается при создании объекта. Свойство доступно только для чтения |
Source | Имя объекта или приложения, которое сгенерировало ошибку |
StackTrace | Последовательность
вызовов, которые привели к |
InnerException | Содержит ссылку на исключение, послужившее причиной генерации текущего исключения |
TargetSite | Метод, выбросивший ислючение |