4887

Обработка исключений и аномальных ситуаций в программировании

Лекция

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

Обработка исключений. Исключением называют возникновение аномальной ситуации во время выполнения, которое программа может обнаружить, например: деление на 0, выход за границы массива или отсутствие требуемого количества свободной памяти. Такие сит...

Русский

2012-11-28

43.5 KB

3 чел.

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

Исключением называют возникновение «аномальной» ситуации во время выполнения, которое программа может обнаружить, например: деление на 0, выход за границы массива или отсутствие требуемого количества свободной памяти. Такие ситуации нарушают нормальный ход работы программы и требуют немедленной реакции. В C++ имеются встроенные средства для оповещения об исключительной ситуации и её обработки. С помощью этих средств активизируется механизм, позволяющий двум несвязанным (или независимо разработанным) фрагментам программы обмениваться информацией об исключении.

Без использования механизма исключений обработка ошибок часто реализуется громоздким и навязчивым способом с явной проверкой всех потенциально опасных моментов в программе. В следующем примере реализованы простейшие функции, вычисляющие корень из числа (с проверкой неотрицательности) и деления (с проверкой деления на 0), еще одна функция вычисляет квадратный корень частного с их использованием. Нетрудно видеть, что большое количество проверкок загромождает программу и вызывает необходимость явно использовать дополнительный выходной аргумент – «статус выполнения» во всех функциях.

// Коды статуса, возвращаемые функциями

enum Status

{

  SUCCESS = 0,         // Признак успешного выполнения

  NEGATIVE_ROOT_ERROR, // Ошибка при попытке вычислить квадратный

                       // корень отрицательного аргумента

  ZERO_DIVISION_ERROR  // Ошибка при попытке деления на 0

};

// Функция вычиляет квадратный корень sqrt(val)

Status squareRoot( double val, double * result )

{

  if ( val < 0.0 )

     return NEGATIVE_ROOT_ERROR;

  * result =  std::sqrt( val );

  return SUCCESS;

}

// Функция выполняет деление a / b

Status divide( double a, double b, double * result )

{

  if ( b == 0 )

     return  NEGATIVE_ROOT_ERROR;

  * result = a / b;

  return SUCCESS;

}

// Функция вычисляет sqrt( a / b )

Status sqrtDiv( double a, double b, double * result )

{

  double d;

  Status s = divide( a, b, & d );

  if ( s != SUCCESS )

     return s;

  s = squareRoot( d, result );

  if ( s != SUCCESS )

     return s;

  return SUCCESS;

}

void main()

{

  Double result;

  Status s = sqrtDiv( 5, -1, & result );

  

  if ( s != SUCCESS )

  {

     std::cout << "Ошибка с кодом " << s << std::endl;

     return;

  }

}

С использованием механизма исключительных ситуаций проверка ошибок организуется гораздо проще и элегантнее. Когда встречается аномальная ситуация, та часть программы, которая её обнаружила, может возбудить исключение с помощью инструкции throw (англ. бросить) – сам объект-исключение представляет собой обычную переменную любого типа (как правило, встроенные типы для этого не используются, гораздо удобнее описать собственный тип с включением в него дополнительной информации об аномальной ситуации).  С этого места выполнение аномального фрагмента программы останавливается и начинается поиск подходящего блока-обработчика, соответствующего типу возбужденного исключения.

Блок-обработчик описывается инструкцией catch(arg) (англ. поймать) с аргументом, описывающим тип перехватываемого этим блоком исключения (напоминает определение функции с одним параметром). Блоков-обработчиков может быть несколько, все они описываются последовательно сразу за блоком-инициатором проверки исключений, описываемым ключевым словом try (англ. пробовать). При возбуждении где-либо в пределах try-блока исключения, последующий список catch-блоков будет просматриваться последовательно до тех пор, пока какой-либо из них не окажется способным перехватить возбужденное исключение, в этом случае, управление передается в этот catch-блок, а аргумент catch-блока принимает значение возбужденного исключения (аналогично вызову функции с одним параметром). Если ни один из catch-блоков не способен перехватить исключение, то процесс поиска продолжится во внешнем (вызывающем) коде. Если же подходящий обработчик исключения не обнаружится вовсе, то программа будет аварийно завершена. Для перехвата всех исключений, вне зависимости от их типа, исользуется специальный универсальный блок-обработчик catch(...), который должен быть последним в списке всех блоков-обработчиков. Разумеется, в таком обработчике сам объект-исключение недоступен, поскольку неизвестен его тип. Следующий пример иллюстрирует простейшее использование обработки исключений:

  try // Попытка выполнить "опасный" участок кода

  {

 // Некоторые действия...

     throw 1; // Выбрасываем исключение

// Инструкции после throw не выполняются!

     std::cout << "Не выполняется";

  }

  catch( int e ) // перехват исключения типа int

  {

     std::cout << "Исключение типа int: " << e << std::endl;

  }

  catch( double e ) // перехват исключения типа double

  {

     std::cout << "Исключение типа double: " << e << std::endl;

  }

  catch( ... ) // перехват всех исключений

  {

     std::cout << "Исключение неизвестного типа!" << std::endl;

  }

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

// Коды ошибок (исключения)

enum ErrorCode

{

  NEGATIVE_ROOT_ERROR, // Ошибка при попытке вычислить квадратный

                       // корень отрицательного аргумента

  ZERO_DIVISION_ERROR  // Ошибка при попытке деления на 0

};

// Функция вычиляет квадратный корень sqrt(val)

double squareRoot( double val )

{

  if ( val < 0.0 )

     throw NEGATIVE_ROOT_ERROR; // Выбрасываем исключение

  return std::sqrt( val );

}

// Функция выполняет деление a / b

double divide( double a, double b )

{

  if ( b == 0 )

     throw NEGATIVE_ROOT_ERROR; // Выбрасываем исключение

  return a / b;

}

// Функция вычисляет sqrt( a / b )

double sqrtDiv( double a, double b )

{

  return squareRoot( divide( a, b ) );

}

void main()

{

  try // Попытка выполнить "опасный" участок кода

  {

     double result = sqrtDiv( 5, -1 );

  }

  catch( ErrorCode errorCode ) // перехват исключений типа ErrorCode

  {

     std::cout << "Ошибка с кодом: " << errorCode << std::endl;

  }

}


 

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

32060. Формирование инфраструктуры региональной инновационной системы, обеспечивающую коммерциализацию результатов интеллектуальной собственности в Вологодской области 3.62 MB
  Схема инфраструктуры региональной инновационной системы Вологодской области, модель взаимодействия инвестиционной компании с субъектами инфраструктуры РИС Вологодской области, схема стерильной колонки с сорбентом для очистки крови, план эвакуации БУ ВО «Бизнес-инкубатор»
32061. АНАЛИЗ ФИНАНСОВОГО СОСТОЯНИЯ ПРЕДПРИЯТИЯ» НА ПРИМЕРЕ ОАО «НГПЭ» 1.72 MB
  Анализ финансовой отчетности — это процесс, при помощи которого оценивается прошлое и текущее финансовое положение и результаты деятельности организации. Однако при этом главной целью является оценка финансово-хозяйственной деятельности организации относительно будущих условий существования.
32062. Анализ финансовых результатов деятельности предприятия и пути их увеличения (на базе материалов ЗАО «ИЖИЦА») 927 KB
  Цель данной дипломной работы заключается в исследовании финансовых результатов деятельности предприятия и разработки мероприятий по их повышению. Объектом исследования является ЗАО «ИЖИЦА». Предметом исследования является сама методика анализа финансовых результатов и практика применения их в управленческой деятельности. Анализируемый период охватывает три года работы предприятия, т.е. 2007, 2008 и 2009 гг.
32063. Совершенствование процедур банковского аудита в современных условиях 503 KB
  Основы и этапы возникновения специального банковского аудита [2. Основные этапы формирования и развития банковского аудита [2. Институциональные основы аудита банков в Российской Федерации [3] Глава 2. Совершенствование процедур банковского аудита в современных условиях [4.
32064. Анализ ликвидности и платёжеспособности ОАО «Промтехмонтаж» 565 KB
  Техникоэкономическая характеристика деятельности предприятия 2.2 Обеспеченность предприятия ОАО Промтехмонтаж трудовыми и материальными ресурсами 31 2.3 Основные финансовые и экономические показатели деятельности предприятия 36 Глава 3. Финансовое состояние проявляется в платежеспособности предприятия в способности вовремя удовлетворять платежные требования поставщиков в соответствии с хозяйственными договорами возвращать кредиты выплачивать заработную плату вносить платежи в бюджет.
32065. Разработка предложений по оптимизации структуры активов исследуемой организации 2.32 MB
  Целью данной выпускной квалификационной дипломной работы является разработка предложений по оптимизации структуры активов исследуемой организации. Для достижения поставленной цели необходимо решить следующий ряд задач: определить теоретические и методические подходы к оценке структуры активов организации: понятие сущность назначение активов организации; структуру активов организации методику оценки оптимальной структуры активов организации; оценить структуру активов организации на примере ОАО НГПЭ за 2006 2008 гг.; разработать...
32066. Оценка финансового состояния предприятия и разработка мероприятий по его улучшению (на примере ООО «Маркет-Сервис») 1.13 MB
  С его помощью вырабатывается стратегия и тактика развития предприятия обосновываются планы и управленческие решения осуществляется контроль их выполнения выявляются резервы повышения эффективности производства оцениваются результаты деятельности предприятия его подразделений и работников. Для обеспечения эффективной деятельности в современных условиях руководству необходимо уметь реально оценивать финансовоэкономическое состояние своего предприятия а также состояние деловой активности партнеров и конкурентов. Финансовое состояние...
32067. Исследование личностной и социальной идентичности в психологии 49 KB
  Агеев Белинская В психологии: Идентичность психологическое представление человека о своем Я; отождествление человеком самого себя частично осознаваемое неосознаваемое с теми или иными типологич. Социальная и личностная идентичность. Эриксон: идентичность возникающий на биологической основе продукт определенной культуры на становление влияют особенности культуры и возможности данного индивида. Идентичность формируется в процессе взаимодействия с социокультурным окружением поэтому важно чтобы ребенок общался со взрослыми с...
32068. Я-концепция Л и регуляции соц-ого поведения. Самоув и псих-е защиты 57 KB
  В 60е гг введение в обиход понятия идентичность помогло выйти из тупика т. идентичность задает дихотомию: социальное и личное есть место для 2х подходов. Он рассматривал идентичность как некоторую структуру состоящую из определенных элементов переживаемую субъективно как чувство тождественности и непрерывности собственной личности. Идентичность – это сложное личностное образование имеющее многоуровневую структуру.