Форум программистов, компьютерный форум CyberForum.ru

Когда и где следует использовать механизм исключительных ситуаций? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Чем отличаются объявления const char* и const* char http://www.cyberforum.ru/cpp-beginners/thread1236908.html
Прошу объяснить мне, чем отличаются объявления const char* и const* char и как объявить: указатель на константный массив символов, константный указатель на массив символов, указатель на массив константных символов. Просто совсем запутался в определениях, прошу помощи Использую книгу Стефана Р. Дэвиса "Программирование на С++ для чайников". Тема в книга описана, но, я понять не смог
C++ Телефонные номера, которые набираются на кнопочном телефоне ходом коня Динамическое программирование Ход конем (Время: 1 сек. Память: 16 Мб) Шахматная ассоциация решила оснастить всех своих сотрудников такими телефонными номерами, которые бы набирались на кнопочном телефоне ходом коня. Например, ходом коня набирается телефон 340-49-27. При этом телефонный номер не может начинаться ни с цифры 0, ни с цифры 8. Требуется написать программу, определяющую... http://www.cyberforum.ru/cpp-beginners/thread1236897.html
C++ А как ваше начальство относится к новым стандартам и boost?
Разрешают ли вам использовать С++11, boost? Если нет - чем обосновывают. Если сначала нет, потом да - расскажите как этого добились. Здесь же можно указывать и в какой IDE работаете. Просьба отвечать лишь тех, кто работает в корпоративном секторе.
Что означает знак двойного двоеточия "::"? C++
не могу я найти
C++ Ошибка при запуске проекта: error: no match for ‘operator>>’ http://www.cyberforum.ru/cpp-beginners/thread1236744.html
В NetBeans создал проект: Добавлено через 1 минуту #include <iostream> #include <string> using namespace std; int main() {
C++ Как понять список формальных параметров функции Bar? class Foo { void friend Bar(Foo & foo); private: int data; подробнее

Показать сообщение отдельно
Evg
Эксперт CАвтор FAQ
17462 / 5700 / 361
Регистрация: 30.03.2009
Сообщений: 15,639
Записей в блоге: 26
02.08.2014, 13:35     Когда и где следует использовать механизм исключительных ситуаций?
На пальцах можно сказать, что в любом культурном компиляторе поддержка исключений устроена так, что оператор try работает очень быстро, а оператор throw/catch работает очень медленно. Ещё одной особенностью исключения является многоуровневый выход из процедур.

Поэтому все эти механизмы используются в основной своей массе для обработки ошибочных ситуаций в программе, которые возникают редко и для которых не требуется большой скорости работы. Но можно использовать и для других целей. Т.е. понятия "исключительная ситуация" и "ошибка" НЕ эквивалентны

Возьмём некоторый абстрактный алгоритм, который устроен в виде цепочки вызовов. При этом может получиться, что входные данные для алгоритма заданы некорректно, но это выясняется глубоко (т.е. через несколько вызовов). А поэтому если делать реализацию без исключительных ситуаций, то получится так, что, допустим, ошибка может обнаружиться на 10-м уровне вложенности, а потому чтобы вернуть в точку начала информацию об ошибке требуется все промежуточные 9 уровней вложенности писать так, чтобы они тоже следили за этой ошибкой

Типа того:

C++
int main (void)
{
  /* Вызываем наш алгоритм. Если в ответ вернули true, значит всё хорошо,
   * если вернули false, значит были ошибки во входных данных */
  res = func (...);
  if (res == false)
    /* выдаём информацию об ошибке */
}
 
bool func (...)
{
  ...
  res = func1 (...);
  if (res == false)
    /* Где-то на нижних уровнях случилась ошибка, возвращаем
     * информацию об этом наверх */
    return false;
  ...
  return true;
}
 
/* Здесь по смыслу всё то же самое */
bool func1 (...)
{
  ...
  res = func2 (...);
  if (res == false)
    /* Где-то на нижних уровнях случилась ошибка, возвращаем
     * информацию об этом наверх */
    return false;
  ...
  return true;
}
 
/* Далее по такому принципу ещё несколько уровней */
 
bool func10 (int x, int y)
{
  ...
  /* И вот уже на самом низком уровне мы можем проверить,
   * что какие-то промежуточно вычисленные параметры оказываются
   * некорректными */
  if ((a + b) > 10 && (a * b) < 7 && ....)
    return false;
  ...
  return true;
}
При таком подходе мы должны постоянно отслеживать на всех уровнях возможные ошибки, произошедшие на более низких уровнях. И весь этот геморрой только ради того, чтобы в конечном итоге наверху выдать сообщение о том, что входные данные были некорректными. А может потребоваться ещё и детализация ошибки - т.е. не просто "данные корректны" или "данные некорректны", а ещё и с описанием того, что конкретно некорректно и на каком уровне проявилось, то код будет сильно перегружен обработкой ситуаций, которые, грубо говоря, являются нерабочими - т.е. информация об ошибках в боевом режиме программы будет выдаваться редко, но время на постоянную проверку на всех уровнях будет тратиться.

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

C++
int main (void)
{
  /* Вызываем наш алгоритм. Если было брошено исключение, значит
   * были ошибки во входных данных */
  try
  {
    func (...);
  } catch (...)
  {
    /* выдаём информацию об ошибке */
  }
}
 
/* Обращаем внимание на то, что нам уже не нужно возвращать
 * информацию о корректности или неорректности */
void func (...)
{
  ...
  func1 (...);
  ...
}
 
/* Здесь по смыслу всё то же самое */
void func1 (...)
{
  ...
  func2 (...);
  ...
}
 
/* Далее по такому принципу ещё несколько уровней */
 
void func10 (int x, int y)
{
  ...
  /* И вот уже на самом низком уровне мы можем проверить,
   * что какие-то промежуточно вычисленные параметры оказываются
   * некорректными. И только здесь мы генерируем исключительную
   * ситуацию, про которую более высокие уровни даже не знают,
   * а потому и не тратят время на её обработку */
  if ((a + b) > 10 && (a * b) < 7 && ....)
    trow ...;
  ...
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru