Программирование >>  Программирование на языке c++ 

1 ... 94 95 96 [ 97 ] 98 99 100 ... 159


В этом случае автоматически вызывается библиотечная функция 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 здесь заведомо задана ошибка, которая



1 ... 94 95 96 [ 97 ] 98 99 100 ... 159

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика