Catch (TypeToCatch ExceptionToCatch2)

Обработка исключений

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

Краткие сведения из теории

1.  Механизм обработки исключений в C++Builder

При разработке приложений часто возникают ситуации, при которых ответственность за правильность выполнения операций, операторов и даже отдельных функций целиком возлагается на программиста. Арифметические вычисления (деление на нуль), преобразования типа, работа с индексами и адресами, корректная формулировка условий в операторах управления, работа с потоками ввода-вывода – это далеко не полный перечень неконтролируемых в C++ ситуаций.

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

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

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

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

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

Язык C++ определяет стандарт обслуживания исключений в рамках объектно-ориентированного программирования. C++Builder предусматривает специальные механизмы для обработки исключений (ошибок), которые могут возникнуть при использовании Библиотеки Визуальных Компонентов. C++Builder также поддерживает обработку исключений самой операционной системы и модель завершения работы приложения.

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

Обслуживаются только так называемые синхронные исключения, которые возникают внутри программы. Такие внешние события, как нажатие клавиш Ctrl+С, исключениями не считаются.

Наиболее приемлемый путь борьбы с исключениями – отлавливание и обработка их с помощью блоков try…catch. Синтаксис этих блоков следующий:

Try

{

  // Критический код, выполнение которого может привести к возникновению ошибки времени выполнения;

}

Catch (TypeToCatch ExceptionToCatch1)

{

// Код, исполняемый при возникновении исключения ExceptionToCatch1;

}

catch (TypeToCatch ExceptionToCatch2)

{

// Код, исполняемый при возникновении исключения ExceptionToCatch2;

}

catch (…)

{

// Код, исполняемый при возникновении остальных исключений;

}

__finally

{

// Код, выполняющийся всегда, независимо от того, произошло исключение или нет;

}

 

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

1 Программа ищет обработчик для данного типа исключения.

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

3 Выполняется код из секции __finally.

4 Если обработчик не был найден, вызывается функция terminate для завершения приложения.

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

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

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

2. Типы основных исключений

Все исключения являются объектами, порожденными от базового класса Exception. Свойство Message этого класса содержит информацию о типе ошибки.

Рассмотрим типы наиболее часто обрабатываемых исключений.

EArrayError – ошибочные действия с массивами (неверный индекс и т. д.)

EConvertError – ошибки преобразования строк.

EDatabaseError – ошибки при работе с базой данных.

EDBEngineError – ошибки при работе с BDE.

EIntError – исключения, возникающие при выполнении целочисленных математических операций. От данного класса порождены классы:

EDivByZero – попытка целочисленного деления на 0.

EIntOverflow – переполнение при выполнении операций с целыми числами.

EMathError – исключения, возникающие при выполнении вещественных математических операций. От данного класса порождены классы:

EInvalidArgument – недопустимое значение параметра математической функции.

EOverflow – переполнение регистра при выполнении операций с плавающей запятой.

EUnderflow – потеря значащих разрядов.

EZeroDivide – деление на 0 вещественного числа.

EPrinter – ошибки при печати.

EStreamError – ошибки потоков ввода-вывода. От данного класса порождены классы:

EFCreateError – ошибка создания файла.

EFOpenError – ошибка открытия файла.

EFilerError – ошибки файловых потоков (операции чтения, записи).


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: