89785

Исключения С++

Лекция

Информатика, кибернетика и программирование

Исключительные ситуации и их обработка. Исключениями называют нештатные (ошибочные) ситуации, которые прерывают программу с сообщениями об ошибке, выдающей системой.

Русский

2015-05-13

132.88 KB

4 чел.

Исключения С++

Содержание

Исключительные ситуации и их обработка

  •   стандартные библиотеки assert и  signal
  •   исключения в С++
  •   генерация исключений throw
  •   контрольный блок try
  •   функции-обработки исключений catch
  •   стандартные функции-обработки исключений
  •   стандартные исключения при работе с динамической памятью
  •   стандартные исключения класса exception

Исключительные ситуации и их обработка

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

Для предотвращения такого прерывания в С++ используются специальные приемы программирования.

Стандартная библиотека ASSERT.H

Стандартная библиотека ASSERT.H предоставляет макропроверки выражений:

assert(выражение);

Если результат выраженияложь, то выполнение программы прерывается с выводом диагностического сообщения.

Проверка не выполняется если определено макро NDEBUG.

Стандартная библиотека SIGNAL.H

Стандартная библиотека SIGNAL.H предоставляет механизм для простой обработки определяемых системой исключений:

#define SIGINT 2 /*сигнал прерывания*/

#define SIGFPE 8 /* исключение с плавающей точкой*/

#define SIGABRT 22 /*сигнал аварийного завершения*/

Такие исключения являются асинхронными и не выводят никаких сообщений.

Прототип функции raise() используют для генерации явного исключения:

raise(SIGFPE);//возбужден сигнал исключения с плавающей точкой

Подобные исключения могут обрабатываться и с помощью функции signal():

//вызов my_abrt()

signal(SIGABRT,my_abrt());

//действовать по умолчанию

signal(SIGABRT,SIG_DFL);

//игнорировать SIGFPE

signal(SIGFPE,SIG_IGN);

Пример#27. Использование SIGNAL.H

#include <signal.h>

#include <time.h>

#include <iostream.h>

#include <stdlib.h> //для exit(0)

//обработчик ИС SIGINT

void cntrl_c_handler(int sig);

inline double clk_psec()

{return static_cast<double>(clock())/CLOCKS_PER_SEC;}

int main()

{ int i=0, j;

cout<<“Считаем до J миллионов, введите j:”; cin>>j;

 j*=1000000;

 signal(SIGINT, cntrl_c_handler);

cout<<clk_psec()<<“ начальное время\n”;

 while (1){ ++i; if (i>j){

 cout<<clk_psec()<<“ конец цикла\n”;

 cout<<“ цикл исполнен ”<<j/1000000 <<“ миллионов раз”<<endl;

raise(SIGINT);//неявный вызов функции //обработчика ИС SIGINT

cout<<“\nвведите j:cin>>j;

j*=1000000; i=0;

cout<<clk_psec()<<“ начало цикла\n”;

}

}

}

//определение функции обработчика ИС SIGINT

void cntrl_c_handler(int sig)

{ char c;

 cout<<“прерывание”;

 cout<<“Введите Д для продолжения:”; cin>>c;

 if (c==‘Д’)

 signal (SIGINT, cntrl_c_handler);

else exit(0);

}

Исключения С++

Для реализации механизма обработки синхронных ИС введены следующие ключевые слова:

  •  try (контролировать)
  •  catch (ловить, перехватывать)
  •  throw (генерировать, порождать, бросать, посылать, формировать)

Генерация исключений

Конструкция вида:

throw выражение;

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

Конструкция без аргумента:

throw;

может использоваться внутри catch для перезапуска текущего исключения.

Генерация исключений

Выражение в throwявляется временный статический объект, существующий до тех пор, пока не будет произведен выход из обработчика исключения.

Выражение отлавливается catch, который может использовать его значение:

int i;

throw i;

catch (int n) {cerr<<n<<endl;}

Контрольные блоки

С помощью блока:

try

{операторы_контролируемого_блока}

список_обработчиков_catch

программист указывает, какие исключения throw следует запускать и отслеживать в перечисленных обработчиках catch.

Обработчики

Обработчикэто функция с одним параметром, не возвращающая никакого значения:

  1.  обработчик использует значение исключения

catch {тип_исключения имя} {операторы}

  1.  обработчик не использует значение исключения. 

catch {тип_исключения} {операторы}

  1.  обработчик реагирует на любое исключение

catch {…} {операторы}

Пример #28. Использование механизма исключения в С++

#include <iostream.h>

//функция, генерирующая исключение

void compare(int k)

{ if (k%2 != 0) throw k;

else throweven”;

}

//Функция с контролем и обработкой исключений

void GG(int j)

{ try

 { try {compare(j);}

 catch (int n)

  {cout<<“\nOdd”;

//генерация исключения во внешнем блоке try

  throw;}

 catch (const char*)

  {cout<<“\nEven”;}

 }

 catch (int i){cout<<“\nResult=”<<I;}

}

//Главная часть 

int main(){GG(4); GG(7); return 0;}

Результат работы программы:

Even

Odd

Result=7

Системные функции обработки исключений

К ним относятся:

  •  terminate() –когда нет ни одного обработчика
  •  unexpected() –когда исключение отсутствует в списке
  •  abort() –вызывается по умолчанию
  •  exit()вызывается для прерывания программы

Их поведение состоит в вызове функции terminate(), которую можно переопределить, используя функцию:

set_terminate()

Вызов функции unexpected() можно переопределить с помощью функции:

set_unexpected()

Пример #29. Замена функции terminate()

#include <stdlib.h>// abort()

#include <except.h>

#include <iostream.h>

//указатель на предыдущую функцию

 void (*old_terminate)();

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

 void new_terminate()

{cout<<“\nNew”; abort();}

int main()

{//установка своей функции обработки

 old_terminate= set_terminate  (new_terminate);

//генерация исключения вне //контролирующего блока try

 throw(25);

return 0;

}

Стандартные исключения при работе с динамической памятью

Исключение типа xalloc (except.h) запускается, если оператору new не удается выделить место в свободной памяти, при этом вызывается функция, адресуемая указателем _new_handler().

Функция (new.h)

set_new_handler(my_handler) ;

позволяет назначить свою функцию my_handler для обработки такого исключения.

Пример #30. При выделении динамической памяти

#include <iostream.h>

#include <new.h> //set_new_handler()

#include <stdlib.h>//abort()

void new_new_handler()

{cerr<<“Ошибка при выделении памяти!”; abort(); }

int main()

{set_new_handler(new_new_handler);

for (int i=1;i<=1000; i++)

{cout<<n;

new char[614400]; //пытаемся выделить 60Кб

 cout<<“: Успех!”<<endl;}

 return 0;

}

Результат выполнения программы:

  1.  Из интегрированной среды Borland C++ 3.1 
  •  ошибка при n=1
  1.  Из командной строки ДОС
  •  ошибка при n=7 и физической памяти выделено 420 Кб
  1.  Откомпилированная под MS Windows компилятором  Borland C++ 4.5 в режиме EasyWin
  •  ошибка при n=257 и памяти выделено 15Мб, в том числе и виртуальная память под Windows

Стандартные исключения базового класса exception

Производный класс logic_error (логические ошибки) включает исключения:

  •  bad_cast (ошибка приведения)
  •  out_of_range (вне диапазона)
  •  bad_typeid (ошибка оператора typeid())

Производный класс runtime_error (ошибки времени выполнения) включает исключения:

  •  range_error (ошибка диапазона)
  •  overflow_error (переполнение)
  •  bad_alloc (ошибка размещения)

Пример #31. Тестирование приведения типов, использующая RTTI 

#include <iostream.h>

#include <typeinfo.h>//class __rtti typeinfo

#include <stdexception.h>//class exception

using namespace std;

class A {public:

 virtual void foo(){cout<<“in A”<<endl;}}

class B: public A 

{public:

 void foo(){cout<<“in B”<<endl;}}

// главная программа

int main()

{ try{ A a, *pa; B b, *pb;

 pa=&b;

 pb=dynamic_cast<B*>(pa);//удачно

 pb->foo();

 pa=&a;

 pb=dynamic_cast<B*>(pa);//неудачно

 pb->foo(); }

catch(bad_cast){cout<<“Bad cast\n”;}

  return 0;

}


 

А также другие работы, которые могут Вас заинтересовать

29404. Электропривод постоянного тока по системе ТП-Д 28.5 KB
  В буровых установках для бурения скважин глубиной 6510 км в ЭП буровых насосов используются ДПТ управляемые по системе ТПД. Буровыми насосами с регулируемым ЭП по системе ТПД оснащаются буровые установки БУ2500 ЭП и БУ6500 ЭП и установки морского бурения. Механическая характеристика регулируемого ЭП бурового насоса по системе ТПД.
29405. Автоматические регуляторы подачи долота 94 KB
  Подача долота это последовательное опускание верхней точки КБТ в процессе бурения при этом скорость подачи долота должна быть равна скорости разбуривания. Задача плавной и равномерной подачи долота решается применением автоматических регуляторов. В зависимости от места расположения автоматические регуляторы подачи долота бывают наземными или глубинными погружными.
29406. АСИНХРОННЫЕ МАШИНЫ (ПЕРЕМЕННОГО ТОКА) 35 KB
  Асинхронный двигатель состоит из неподвижного статора и вращающегося ротора разделенных между собой воздушным зазором. Сердечник собирается из тонких листов электротехнической стали изолированных друг от друга и запрессовывается в корпусе статора. На внутренней поверхности сердечника вырублены пазы в которые укладывается трехфазная обмотка статора. Обмотка подключена к трехфазной сети и представляет собой систему проводников сдвинутых относительно друг друга в пространстве вдоль окружности статора на 120о.
29407. Буровые установки 27.5 KB
  Регулируемые приводы используют систему ТПДПТ. Силовой привод буровой установки может быть дизельным электрическим дизельэлектрическим и дизельгидравлическим. Дизельный привод применяют в районах не обеспеченных электроэнергией необходимой мощности.
29408. Взрывозащищенное электрооборудование 43.5 KB
  Взрывозащищенное электрооборудование различается по уровню взрывозащиты группам и температурным классам. Установлены следующие уровни взрывозащиты электрооборудования: 1. Вид взрывозащиты определяется установленным набором средств взрывозащиты. Для взрывозащищенного электрооборудования установлены следующие виды взрывозащиты: Взрывонепроницаемая оболочка [d].
29409. Дизель-электрический привод буровых установок 28 KB
  В последние годы существует тенденция расширения номенклатуры и объемов производства буровых установок с дизельэлектрическим приводом. Переход к автономному энергоснабжению позволяет решить проблему энергоснабжения удаленных от базы буровых установок проблему слабых сетей решить проблему повышения установленной мощности главных и вспомогательных приводов на буровых установках и др. Перечисленные недостатки системы ГД затрудняют ее использование в морских буровых установках.
29410. МАШИНЫ ПОСТОЯННОГО ТОКА 56.5 KB
  Она состоит из неподвижного статора и вращающегося якоря в машинах переменного тока вращающаяся часть – ротор. Коммутация – это процесс переключения секций обмотки якоря из одной параллельной ветви в другую и связанные с этим явления. Концы секций припаивают к пластинам коллектора что образует замкнутую обмотку якоря. Коллектор набран из медных пластин клинообразной формы изолированных друг от друга и корпуса и образующих в сборе цилиндр который крепится на валу якоря.
29411. Характеристика электрооборудования во взрывоопасных зонах в нефтяной и газовой промышленности (НГП) 35 KB
  Взрывоопасной зоной называют помещение или ограниченное пространство в помещении или наружной установке в которых имеются или могут образовываться взрывоопасные смеси. Взрывоопасные смеси горючих газов с воздухом или смеси легковоспламеняющихся жидкостей с воздухам согласно правилам устройства электроустановок ПУЭ классифицируются по категориям I II IIA IIB IIC и группам T1T6. Например ко II категории взрывоопасной смеси относятся промышленные газы и пары к I категории – рудничный газ. Безопасный экспериментальный...
29412. Климатические условия эксплуатации и условия размещения электрооборудования 26.5 KB
  Электрооборудование предназначенное для эксплуатации на суше и реках в районах с умеренным климатом имеет обозначение У; с холодным климатом ХЛ; сухим и влажным тропическим Т; для всех макроклиматических районов на суше О. Электрооборудование предназначенное для установки в районах с умеренно холодным морским климатом имеет обозначение М; с тропическим морским ТМ. В зависимости от условий размещения предусматривается различное исполнение электрооборудования которому также присваивается определенное обозначение....