Генерация и обработка исключений

Автор: Пользователь скрыл имя, 01 Декабря 2011 в 12:29, доклад

Описание работы

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

Работа содержит 1 файл

Обработка и генерация исключений_Татарников.docx

— 35.87 Кб (Скачать)

ГЕНЕРАЦИЯ И ОБРАБОТКА ИСКЛЮЧЕНИЙ 

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

       Обработка исключительных ситуаций (англ. exception handling) — механизм языков программирования, предназначенный для описания реакции программы на ошибки времени выполнения и другие возможные проблемы (исключения), которые могут возникнуть при выполнении программы и приводят к невозможности (бессмысленности) дальнейшей отработки программой её базового алгоритма. В русском языке также применяется более короткая форма термина: «обработка исключений».

    Классические  примеры исключений:

  • Нулевое значение знаменателя при выполнении операции целочисленного деления. Результата у операции быть не может, поэтому ни дальнейшие вычисления, ни попытка использования результата деления не приведут к решению задачи.
  • Ошибка при попытке считать данные с внешнего устройства. Если данные не удаётся ввести, любые дальнейшие запланированные операции с ними бессмысленны.
  • Исчерпание доступной памяти. Если в какой-то момент система оказывается не в состоянии выделить достаточный для прикладной программы объём оперативной памяти, программа не сможет работать нормально.
  • Появление сигнала аварийного отключения электропитания системы. Прикладную задачу, по всей видимости, решить не удастся, в лучшем случае (при наличии какого-то резерва питания) прикладная программа может позаботиться о сохранении данных.
  • Появление на входе коммуникационного канала данных, требующих немедленного считывания. Чем бы ни занималась в этот момент программа, она должна перейти к чтению данных, чтобы не потерять поступившую информацию.

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

  • Синхронные исключения могут возникнуть только в определённых, заранее известных точках программы. Так, ошибка чтения файла или коммуникационного канала, нехватка памяти — типичные синхронные исключения, так как возникают они только в операции чтения из файла или из канала или в операции выделения памяти соответственно.
  • Асинхронные исключения могут возникать в любой момент времени и не зависят от того, какую конкретно инструкцию программы выполняет система. Типичные примеры таких исключений: аварийный отказ питания или поступление новых данных.

         В отсутствие собственного механизма обработки исключений для прикладных программ наиболее общей реакцией на любую исключительную ситуацию является немедленное прекращение выполнения с выдачей пользователю сообщения о характере исключения. Можно сказать, что в подобных случаях единственным и универсальным обработчиком исключений становится операционная система. Например, в операционную систему Windows встроена утилита Dr. Watson, которая занимается сбором информации об необработанном исключении и ее отправкой на специальный сервер компании Microsoft.

       Возможно  игнорирование исключительной ситуации и продолжение работы, но такая  тактика опасна, так как приводит к ошибочным результатам работы программ или возникновению ошибок впоследствии. Например, проигнорировав ошибку чтения из файла блока данных, программа получит в своё распоряжение не те данные, которые она должна была считать, а какие-то другие. Результаты их использования предугадать невозможно.

       Обработка исключительных ситуаций самой программой заключается в том, что при  возникновении исключительной ситуации управление передаётся некоторому заранее  определённомуобработчику — блоку кода, процедуре, функции, которые выполняют необходимые действия.

       Существует  два принципиально разных механизма  функционирования обработчиков исключений.

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

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

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

Имя Описание
DivideByZeroException Попытка деления  на ноль
FormatException Попытка передать в метод аргумент неверного формата
IndexOutOfRangeException Индекс массива  выходит за границы диапазона
InvalidCastException Ошибка преобразования типа
OutOfMemoryException Недостаточно  памяти для создания нового объекта
OverFlowException Переполнение  при выполнении арифметических операций
StackOverFlowException Переполнение  стека
 

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

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

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

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

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

       Если  исключение в контролируемом блоке  не возникло, все обработчики пропускаются.

       В любом случае, произошло исключение или нет, управление передается в  блок завершения finally (если он существует), а затем — первому оператору, находящемуся непосредственно за оператором try.

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

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

  • Обработка исключения начинается с появления ошибки. Функция или операция, в которой возникла ошибка, генерирует исключение.
  • Выполнение текущего блока прекращается, отыскивается соответствующий обработчик исключения, и ему передается управление.
  • Выполняется блок finally, если он присутствует.
  • Если обработчик не найден, вызывается стандартный обработчик исключения. Обычно он выводит на экран окно с информацией об исключении и завершает текущий процесс.

       До  сих пор мы рассматривали исключения, которые генерирует среда выполнения C#, но это может сделать и сам  программист. Для генерации исключения используется оператор throw с параметром, определяющим вид исключения. Параметр должен быть объектом, порожденным от стандартного класса System.Exception. Этот объект используется для передачи информации об исключении его обработчику. 

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

           throw [ выражение ];

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

           throw new DivideByZeroException(); 

       Здесь после слова throw записано выражение, создающее объект стандартного класса «ошибка при делении на 0» с помощью операции new.

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

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

Таблица 1.2 – Свойства класса Exception

Свойство Описание
HelpLink URL файла справки с описанием ошибки
Message Текстовое описание ошибки. Устанавливается при создании объекта. Свойство доступно только для  чтения
Source Имя объекта  или приложения, которое сгенерировало  ошибку
StackTrace Последовательность  вызовов, которые привели к возникновению  ошибки. Свойство доступно только для  чтения
InnerException Содержит ссылку на исключение, послужившее причиной генерации текущего исключения
TargetSite Метод, выбросивший  ислючение

Информация о работе Генерация и обработка исключений