Читаем Язык программирования C++. Пятое издание полностью

Классы исключений exception, bad_cast и bad_alloc определяют также стандартный конструктор. Классы runtime_error и logic_error не имеют стандартного конструктора, но имеют конструкторы, получающие символьную строку в стиле С или аргумент библиотечного типа string. Эти аргументы предназначены для дополнительной информации об ошибке. Функция what() этих классов возвращает сообщение, использованное для инициализации объекта исключения. Поскольку функция what() виртуальная, при обработке ссылки на базовый тип вызов функции what() выполнит ту версию, которая соответствует динамическому типу объекта исключения.

Классы исключения для приложения книжного магазина

В приложениях иерархию исключений зачастую дополняют, определяя классы, производные от класса exception (или другого библиотечного класса, производного от него). Такие классы представляют исключения, специфические для данного приложения.

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

// гипотетический класс исключения для приложения книжного магазина

class out_of_stock: public std::runtime_error {

public:

 explicit out_of_stock(const std::string &s):

  std::runtime_error(s) { }

};

class isbn_mismatch: public std::logic_error {

public:

 explicit isbn_mismatch(const std::string &s):

  std::logic_error(s) { }

 isbn_mismatch(const std::string &s,

  const std::string &lhs, const std::string &rhs):

  std::logic_error(s), left(lhs), right(rhs) { }

 const std::string left, right;

};

Здесь специфические для приложения классы исключения определены как производные от стандартного класса исключения. Любую иерархию классов, включая иерархию исключений, можно рассматривать как слоистую структуру. По мере углубления иерархии каждый слой становится более специализированным. Например, первым и наиболее общим слоем иерархии является класс exception. При получении объекта этого типа будет известно только то, что в приложении произошла какая-то ошибка.

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

Классы исключений книжного магазина представляют даже более специализированный слой. Класс out_of_stock представляет проблему времени выполнения, специфическую для данного приложения. Он используется для оповещения о нарушении порядка выполнения. Класс исключения isbn_mismatch представляет собой более специализированную форму класса logic_error. В принципе программа может обнаружить несоответствие ISBN, вызвав функцию isbn().

Использование собственных типов исключений

Собственные классы исключений применяются точно так же, как и классы стандартной библиотеки. Одна часть программы передает объект одного из этих классов, а другая получает и обрабатывает его, устраняя проблему. Например, для перегруженного оператора суммы класса Sales_item можно создать класс исключения isbn_mismatch, передаваемого в случае обнаружения ошибки несовпадения ISBN.

// передает исключение, если isbn объектов не совпадают

Sales_data&

Sales_data::operator+=(const Sales_data& rhs) {

 if (isbn() != rhs.isbn())

  throw isbn_mismatch("wrong isbns", isbn(), rhs.isbn());

 units_sold += rhs.units_sold;

 revenue += rhs.revenue;

 return *this;

}

Обнаружив эту ошибку, использующий оператор += код сможет передать соответствующее сообщение об ошибке и продолжить работу.

// применение исключения в приложении книжного магазина

Sales_data item1, item2, sum;

while (cin >> item1 >> item2) { // прочитать две транзакции

 try {

  sum = item1 + item2; // вычислить их сумму

  // использовать сумму

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

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

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

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

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

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

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

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

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