Читаем Программирование полностью

<p id="AutBody_Root077"><strong>5.6.3. Неправильный ввод</strong></p>

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

Рассмотрим фрагмент кода, в котором вводится число с плавающей точкой.

double d = 0;

cin >> d;

Мы можем проверить, успешной ли оказалась последняя операция, подвергнув проверке поток cin.

if (cin) {

  // все хорошо, и мы можем считывать данные дальше

}

else {

  // последнее считывание не было выполнено,

  // поэтому следует что-то сделать

}

Существует несколько возможных причин сбоя при вводе данных. Одна из них — тип данных, которые мы пытаемся считать, — отличается от типа double. На ранних стадиях разработки мы часто хотим просто сообщить, что нашли ошибку и прекратить выполнение программы, потому что еще не знаем, как на нее реагировать. Иногда мы впоследствии возвращаемся к этому фрагменту и уточняем свои действия. Рассмотрим пример.

double some_function()

{

 double d = 0;

 cin >> d;

 if (!cin)

   error("невозможно считать число double в 'some_function()'");

   // делаем что-то полезное

}

Строку, переданную функции error(), можно вывести на печать для облегчения отладки или для передачи сообщения пользователю. Как написать функцию error() так, чтобы она оказалась полезной для многих программ? Она не может возвращать никакого значения, потому что неизвестно, что с ним делать дальше. Вместо этого лучше, чтобы функция error() прекращала выполнение программы после получения сообщения об ошибке. Кроме того, перед выходом иногда следует выполнить определенные несложные действия, например, оставить окно с сообщением активным достаточно долго, чтобы пользователь мог прочесть сообщение. Все это вполне естественно для исключений (подробнее об этом — в разделе 7.3).

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

Итак, нашу простую функцию error() можно переписать следующим образом:

void error(string s)

{

  throw runtime_error(s);

}

Когда нам потребуется поработать с исключением runtime_error, мы просто перехватим его. Для простых программ перехват исключения runtime_error в функции main() является идеальным.

int main()

try {

  // наша программа

  return 0; // 0 означает успех

}

catch (runtime_error& e) {

  cerr << "runtime error: " << e.what() << '\n';

  keep_window_open();

  return 1; // 1 означает сбой

}

Вызов e.what() извлекает сообщение об ошибке из исключения runtime_error.

Символ & в выражении

catch(runtime_error& e) {

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

Обратите внимание на то, что для выдачи сообщений об ошибках мы использовали поток cerr. Этот поток очень похож на поток cout за исключением того, что он предназначен для вывода сообщений об ошибках. По умолчанию потоки cerr и cout выводят данные на экран, но поток cerr не оптимизирован, поэтому более устойчив к ошибкам и в некоторых операционных системах может быть перенаправлен на другую цель, например на файл. Используя поток cerr, можно документировать ошибки. Именно поэтому для вывода ошибок мы используем поток cerr.

Исключение out_of_range отличается от исключения runtime_error, поэтому перехват исключения runtime_error не приводит к обработке ошибок out_of_range, которые могут возникнуть при неправильном использовании класса vector или других контейнерных типов из стандартной библиотеки. Однако и out_of_range, и runtime_error являются исключениями, поэтому для работы с ними необходимо предусмотреть перехват объекта класса exception.

int main()

try {

  // наша программа

  return 0; // 0 означает успех

}

catch (exception& e) {

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных