|
Программирование >> Программирование на языке c++
В этом случае автоматически вызывается библиотечная функция unexpected, которая задается в виде void unexpectedO; По умолчанию функция unexpected вызывает другую библиотечную функцию terminate, которая задается в виде void terminateO; По умолчанию функция terminate вызывает функцию abort, которая выдает сообщение Abnormal program termination и завершает программу. Пользователь может заменить функции unexpected и terminate своими функциями. Чтобы заменить функцию unexpected, необходимо выполнить следующие действия: 1) описать новую версию функции unexpected, например: void my unexpected(void) { описание новых действий 2) установить (зарегистрировать) новую функцию (my unexpected): set unexpected(my unexpected); Здесь set unexpected - это библиотечная функция языка С++. Соответствующие примеры будут рассмотрены в § 7.8. Чтобы заменить функцию terminate, необходимо выполнить следующие действия: 1) описать новую версию функции terminate, например: void my terminate(void) { описание новых действий } 2) установить (зарегистрировать) новую функцию (my terminate), например: set terminate{my terminate); Здесь set termmate - это библиотечная функция языка С++. Соответствующие примеры рассматриваются в § 7.8. Функция terminate будет вызвана автоматически и тогда, когда генерируется исключение и не находится соответствующий обработчик. Все правила вызова функций unexpected и terminate перечислены в § 7.9. Рассмотрим пример из § 7.5: #include <iostream.h> #define ss 10 struct my struct{ int a,b; my struct(int A.int B) : a(A),b(B){} struct exc { exc() {cout all numbers have been displayed\n ;} }; void display ajess b() throw(); ** throw(exc) void my struct::display a less b() throwQ ** throw{my struct::exc) if (a>=b) throw exc{); cout a++ < b endl; } void main(void) { my struct ms(5,10); try { for(;;) ms.display a less b(); } catch(my struct::exc) {}; Здесь ошибочно задано то, что функция display a less b() не генерирует исключения ( throw() ). На самом же деле эта функция генерирует исключение my struct::exc. В результате программа будет завершаться сообщением: Abnormal program termination. Правильная спецификация исключений показана в комментариях (см. комментарии **). 7.7. Взаимодействие программ на языках С и C+-I- В языке С отсутствует механизм обработки исключений. В то же время программы на языке С++ могут использовать ранее написанные программы на языке С. В этом случае можно рассмотреть следующий подход [1]. Если функция f cpp, написанная на языке С++, вызывает функцию f c, написанную на языке С, то можно предполо- ЖИТЬ, ЧТО при наличии ошибки в f c эта функция устанавливает в некоторое ненулевое значение глобальную переменную errno (подобные действия рекомендованы в языке С). Тогда механизм исключений в f cpp можно включить после проверки значения errno: void f cpp() { errno=0; f c(); if(errno) tlirow exc(errno); Здесь класс exc является классом, через который осуш;ествля-ется взаимосвязь с соответствуюш;им блоком catch. Значение errno передается в объект класса ехе для того, чтобы указать тип ошибки. Если функция f c, написанная на языке С, вызывает функцию f cpp, написанную на языке C-I-+, тогда перед возвратом из функции f cpp в функцию f c можно предусмотреть соот-ветствуюш;ую установку глобальной переменной errno. Другие правила обработки исключений в программах, написанных на языках C/C+-I-, рассмотрены в руководстве [И, с. 181-183]. 7.8. Примеры обработки исключений Рассмотрим примеры, в которых осуществляется обработка исключений. Первый пример показывает, как можно обработать некоторые стандартные исключения. Например, в системе программирования Borland С++ задается стандартное исключение xalloc, которое генерируется в случае наличия ошибки при динамическом выделении памяти (при выделении свободной памяти). Приведенный ниже пример является модифицированной программой из § 2.5. #include <except.h> файл заголовка для функций и клас- сов, поддерживающих механизм обработки исключений #include <stdlib.h> #include <iostream.h> #define x 3000 здесь заведомо задана ошибка, которая
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |