Файл: Pobegaylo_A._C_Cplus_dlya_studenta.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 13.12.2020

Просмотров: 4120

Скачиваний: 28

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Часть IV. Стандартная библиотека языка программирования С++ 

406 

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

#include

 

включить в эту программу соответствующий файл с прототипами 
функций. 
В  данной  книге  рассматриваются  не  все  компоненты  из  стан-
дартной  библиотеки  языка  программирования  C++.  Это  сделано 
по двум причинам. 
Во-первых, стандартная библиотека довольно громоздкая и под-
робное  рассмотрение  всех  компонентов  значительно  увеличило 
бы объем книги. 
Во-вторых, книга предназначена для начинающих и поэтому ма-
ловероятно,  что  подробное  изложение  стандартной  библиотеки 
необходимо  для  таких  читателей.  Даже,  наоборот  —  громозд-
кость может отбить охоту к изучению. 
Поэтому  при  изложении  принят  компромиссный  подход.  Стан-
дартная библиотека  языка  программирования  C  рассмотрена до-
вольно  подробно.  Это  позволяет  ознакомиться  со  стандартными 
функциями,  предназначенными  для  решения  рутинных  задач 
программирования.  Из  стандартной  библиотеки  языка  програм-
мирования C++ дополнительно рассмотрены стандартные средст-
ва, наиболее часто используемые в программировании, а именно: 
обработка  исключений,  динамическая  идентификация  типов,  об-
работка  строк  и  потоки  ввода/вывода.  Однако  следует  заметить, 
что  при  должном  изучении  этой  части  стандартной  библиотеки 
даже  самостоятельное  изучение  остальных  компонентов  стан-
дартной  библиотеки  языка  программирования  C++  не  должно 
вызвать затруднений. 

 


background image

  

 
 

Г Л А В А  

36 

 
 
 

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

<exception> 

36.1. Классы и функции 

В заголовочном файле exception объявляются следующие классы 
и функции, используемые при обработке исключений: 

  namespace std 
  { 
    class exception; 
    class bad exception; 
    typedef void (*unexpected_handler)(); 
    unexpected_handler set_unexpected(unexpected_handler f) 
                                                     throw(); 
    void unexpected(); 
    typedef void (*terminate_handler)(); 
    terminate_handler set_terminate(terminate_handler f) 
                                                     throw(); 
    void terminate(); 
    bool uncaught_exception(); 
  } 

Подробно назначение этих классов и функций рассмотрено в сле-
дующих разделах этой главы. 

  

 


background image

Часть IV. Стандартная библиотека языка программирования С++ 

408 

36.2. Класс 

exception

 

Класс 

exception

 является базовым классом для всех стандартных 

исключений, определенных в стандартной библиотеке языка про-
граммирования С++. Этот класс имеет следующий интерфейс: 

  namespace std 
  { 
    class exception 
    { 
    public: 
      exception() throw(); 
      exception(const exception& rhs) throw(); 
      exception& operator=(const exception& rhs) throw(); 
      virtual ~exception() throw(); 
      virtual const char* what() const throw(); 
    }; 
  } 

Строка  языка  программирования  C,  адрес  которой  возвращает 
метод 

what

,  не  определена.  Эта  строка  может  быть  определена 

конструкторами классов, наследуемых от класса 

exception

Ни  один  из  методов  класса 

exception

  не  выбрасывает  исключе-

ния. 

36.3. Класс 

bad_exception

 

Класс 

bad_exception

  определяет  тип  объектов,  которые  может 

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

exception

  и  имеет  следующий  ин-

терфейс: 

  namespace std 
  { 
    class bad_exception : public exception 
   { 
    public: 
      bad_exception() throw(); 
      bad_exception(const bad_exception&) throw(); 
      bad_exception& operator=(const bad_exception&) throw(); 


background image

Глава 36. Обработка исключений <exception> 

409 

      virtual ~bad_exception() throw(); 
      virtual const char* what() const throw(); 
    }; 

Строка, адрес которой возвращает метод 

what

, зависит от реали-

зации. 

36.4. Аварийное завершение 
программы 

Для  аварийного  завершения  программы  предназначена  функция 

terminate

, которая имеет следующий прототип: 

  void terminate(); 

Функция 

terminate

 вызывает функцию, которая называется 

обра-

ботчиком  аварийного  завершения

  программы  (terminate  handler) 

и имеет следующий прототип: 

  typedef void (*terminate_handler)(); 

Обработчик  аварийного  завершения  программы  устанавливается 
функцией 

set_terminate

, которая имеет следующий прототип: 

  terminate_ handler set_terminate(terminate_handler ph) 
                                                     throw(); 

Эта  функция  устанавливает  новый  обработчик  аварийного  за-
вершения программы, на который указывает параметр 

ph

, и воз-

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

abort

,  которая 

была описана в 

разд. 21.4

В листинге 36.1 приведен пример установки и вызова нового об-
работчика  аварийного  завершения  программы.  Как  правило,  об-
работчик  аварийного  завершения  программы  используется  для 
корректного освобождения ресурсов, захваченных этой програм-
мой. 


background image

Часть IV. Стандартная библиотека языка программирования С++ 

410 

Листинг 36.1. Установка и вызов обработчика аварийного  

завершения программы 

#include <iostream> 
#include <exception> 
using namespace std; 
 
int* p; 
void foo() 

  cout<< "val: " << *p << endl; 
  delete p; 

int main() 

  set_terminate(foo); 
  p = new int(10); 
  terminate();  // val: 10 
  return 0; 

36.5. Обработка  

не специфицированного исключения 

Если функция выбрасывает не специфицированное в ней исклю-
чение, то среда исполнения программы вызывает функцию 

unex-

pected

, которая имеет следующий прототип: 

  void unexpected(); 

Функция 

terminate

  в  свою  очередь  вызывает  функцию,  которая 

называется 

обработчиком  не  специфицированного  исключения

 

(unexpected handler) и имеет следующий прототип: 

  typedef void (*unexpected_handler)(); 

Обработчик не специфицированного исключения устанавливает-
ся  функцией   

set_unexpected

,  которая  имеет  следующий  прото-

тип: 

  unexpected_handler set_unexpected(unexpected_handler ph) 
                                                     throw(); 


Смотрите также файлы