Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

2.4. Исключения 93

2.4 Исключения

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

2.4.1 Объекты исключения

В C ++, исключение «брошено» кодексом, который сталкивается с некоторым неожиданным condi-tion. Исключения могут также быть брошены C ++, окружающая среда во время выполнения должна он en-противостоять неожиданному условию как исчерпывание памяти. Брошенное исключение «поймано» другим кодексом, который «обращается» с исключением так или иначе, или программа неожиданно закончена. (Мы говорим больше о ловли исключений вскоре.)

Исключения - относительно недавнее дополнение к C ++. До наличия исключений ошибки, как правило, обрабатывались при наличии аварийного прекращения работы программы в источнике ошибки, или при наличии включенной функции возвращают некоторую специальную стоимость. Исключения обеспечивают намного более чистый механизм для ошибок из-за неправильного обращения. Тем не менее, по историческим причинам, многим функциям в C ++ стандартная библиотека не бросают исключения. Как правило, они возвращают своего рода специальный ошибочный статус или устанавливают ошибку flag, который может быть проверен.

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

Типы исключения часто формируют иерархии. Например, давайте вообразим hypothet-библиотеку математики iCal, которая может произвести много различных типов ошибок. Библиотека могла бы начаться, определив одно универсальное исключение, MathException, представлять - луг все типы математических ошибок, и затем получить более определенные исключения для особого состояния ошибки. errMsg участник держит последовательность сообщения информативным сообщением. Вот возможное определение этого универсального класса.

класс MathException //универсальное математическое исключение

общественность:

MathException (константа string& допускают ошибку), //конструктор

: errMsg (допускают ошибку)

натяните getError ()возвращают errMsg; //сообщение об ошибке доступа

частный:

последовательность errMsg; //сообщение об ошибке

;

94 Глава 2. Ориентированный на объект дизайн

Используя наследование, чтобы определить новые типы исключения

У вышеупомянутого класса MathException, вероятно, были бы другие членские функции, для

пример, для доступа к сообщению об ошибке. Мы можем тогда добавить более определенный excep-tions, такой как ZeroDivide, чтобы обращаться с делением на нуль и NegativeRoot, обращаться с попытками вычислить квадратный корень отрицательного числа. Мы могли использовать наследование класса, чтобы представлять эти иерархические отношения, следующим образом.

класс ZeroDivide: общественный MathException

общественность:

ZeroDivide (константа string& допускают ошибку), //делятся на ноль

: MathException (допускают ошибку)

;

класс NegativeRoot: общественный MathException

общественность:

NegativeRoot (константа string& допускают ошибку), //отрицательный квадратный корень

: MathException (допускают ошибку)

;

2.4.2 Бросок и ловля исключений

Исключения, как правило, обрабатываются в контексте «попытки» и «ловят» блоки. Блок попытки - блок заявлений, продолженных попыткой ключевого слова. После блока попытки есть один или несколько блоков выгоды. Каждый блок выгоды определяет тип исключения, которое это ловит. Выполнение начинается с заявлений блока попытки. Если все идет гладко, то выполнение оставляет блок попытки и перескакивает через его связанные блоки выгоды. Если исключение брошено, то контроль немедленно вскакивает в соответствующий блок выгоды для этого исключения.

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

t ry

//... прикладные вычисления

если (делитель == 0)

//попытаться разделиться на 0?

бросьте ZeroDivide («Делятся на ноль в Модуле X»);

выгода (ZeroDivide& zde)

//деление на нуль ручки

выгода (MathException& я)

//обращайтесь с любым математическим исключением кроме деления на нуль