Обработка ошибок и исключений. Классы исключений языковой поддержки

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

   
Исключения языковой поддержки используются на уровне языка C++, поэтому их правильнее было бы
отнести к базовому языку, нежели к библиотеке. Этн исключения генерируются при неудачных попытках выполнения некоторых
операций.

  • Исключение класса bad_alloc генерируется при неудачном выполнении глобального оператора new
    (кроме версии new с запретом исключений). Вероятно, это самое важное исключение, поскольку в любой нетривиальной
    программе оно может возникнуть в любой момент.
  • Исключение класса bad_cast генерируется оператором dynamic_cast, если преобразование типа по ссылке
    во время выполнения завершается неудачей.
  • Исключение класса bad_typeid генерируется оператором typeid, предназначенным для идентификации типов по время выполнения. Если аргументом typeid является ноль или null-указатель, генерируется исключение.
  • Исключение класса bad_exception предназначено для обработки непредвиденных исключений.
    В его обработке задействована функция unexpected(), которая вызывается при возникновении исключений, не входящих в
    спецификацию исключений соответствующей функции. Пример:

    class E1 
    class E2
    
    void f() throw(E1)
    {
      .   .   .
      throw E1();
      .   .   .
      throw E2(); 
    }
    

       
    Исключение типа Е2 нарушает спецификацию исключений функции f(). В этом случае будет вызвана функция
    unexpected(), которая обычно передает управление функции terminate() для завершения программы. Но при
    включении в спецификацию исключений класса bad_exceptton функция unexpected() обычно перезапускает
    исключение этого типа:

    class E1 
    class E2
    
    
    void f() throw(E1, std::bad_exception)
    // Генерирует исключения типа E1 или
    // bad_exception для всех остальных типов исключений
    {
      .   .   .   .
      throw E1();    // Генерирует исключение типа Е1
      .   .   .   .
      throw E2();    // Вызывает функцию unexpected(),
                     // которая генерирует bad_exception
    }
    

       
    Итак, если спецификация исключений содержит класс bad_exception, то функция unexpected() может заменить
    исключением bad_exceptlon любое исключение, не входящее в спецификацию.

   
Замечание.
Поведение функции unexpected() можно переопределить. Тем не менее функция никогда не генерирует исключения,
не указанные в спецификации исключений (если она есть).

   
На следующем шаге мы рассмотрим классы исключений стандартной библиотеки.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий