Стенли Липпман - Язык программирования C++. Пятое издание
- Название:Язык программирования C++. Пятое издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2014
- Город:Москва
- ISBN:978-5-8459-1839-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стенли Липпман - Язык программирования C++. Пятое издание краткое содержание
Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под
. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. В соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.
С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать их наилучшие способы применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.
Стенли Б. Липпман Жози Лажойе Барбара Э. Му • Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием
• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования
• Изучите принципы и узнайте почему язык С++11 работает именно так
• Воспользуйтесь множеством перекрестных ссылок, способных помочь вам объединить взаимосвязанные концепции и проникнуть в суть
• Ознакомьтесь с современными методиками обучения и извлеките пользу из упражнений, в которых подчеркиваются ключевые моменты, позволяющие избежать проблем
• Освойте лучшие методики программирования и закрепите на практике изученный материал
Исходный код примеров можно загрузить с веб-страницы книги на сайте издательства по адресу: http://www.williamspublishing.com
Язык программирования C++. Пятое издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
В приведенном выше примере, чтобы избежать суммирования двух объектов класса Sales_item
, представляющих разные книги, использовался оператор throw
. Предположим, что суммирующая объекты класса Sales_item
часть программы отделена от части, взаимодействующей с пользователем. Эта часть могла бы содержать примерно такой код обработки исключения, переданного в блоке сложения.
while (cin >> item1 >> item2) {
try {
// код, который складывает два объекта класса Sales_item
// если при сложении произойдет сбой, код передаст
// исключение runtime_error
} catch (runtime_error err) {
// напомнить пользователю, что ISBN слагаемых объектов
// должны совпадать
cout << err.what()
<< "\nTry Again? Enter y or n" << endl;
char c;
cin >> с;
if (!cin || с == 'n')
break; // выход из цикла while
}
}
В блоке try
расположена обычная логика программы. Это сделано потому, что данная часть программы способна передать исключение типа runtime_error
.
Данный блок try
обладает одним разделом catch
, который обрабатывает исключение типа runtime_error
. Операторы в блоке после ключевого слова catch
определяют действия, выполняемые в случае, если код в блоке try
передаст исключение runtime_error
. В данном случае обработка подразумевает отображение сообщения об ошибке и запрос у пользователя разрешения на продолжение. Когда пользователь вводит символ 'n'
, цикл while
завершается, в противном случае он продолжается и считывает два новых объекта класса Sales_item
.
В сообщении об ошибке используется текст, возвращенный функцией err.what()
. Поскольку известно, что классом объекта исключения err
является runtime_error
, нетрудно догадаться, что функция what()
является членом (см. раздел 1.5.2) класса runtime_error
. В каждом из библиотечных классов исключений определена функция-член what()
, которая не получает никаких аргументов и возвращает символьную строку в стиле С (т.е. const char*
). В случае класса runtime_error
эта строка является копией строки, использованной при инициализации объекта класса runtime_error
. Если описанный в предыдущем разделе код передаст исключение, то отображенное разделом catch
сообщение об ошибке будет иметь следующий вид:
Data must refer to same ISBN
Try Again? Enter y or n
В сложных системах программа может пройти через несколько блоков try
прежде, чем встретится с кодом, который передает исключение. Например, в блоке try
может быть вызвана функция, в блоке try
которой содержится вызов другой функции с ее собственным блоком try
, и т.д.
Поиск обработчика осуществляется по цепочке обращений в обратном порядке. Сначала поиск обработчика исключения осуществляется в той функции, в которой оно было передано. Если соответствующего раздела catch
не найдено, работа функции завершается, а поиск продолжается в той функции, которая вызвала функцию, в которой было передано исключение. Если и здесь соответствующий раздел catch
не найден, эта функция также завершается, а поиск продолжается по цепочке вызовов дальше, пока обработчик исключения соответствующего типа не будет найден.
Если соответствующий раздел catch
так и не будет найден, управление перейдет к библиотечной функции terminate()
, которая определена в заголовке exception
. Поведение этой функции зависит от системы, но обычно она завершает выполнение программы.
Исключения, которые были переданы в программах, не имеющих блоков try
, обрабатываются аналогично: в конце концов, без блоков try
не может быть никаких обработчиков и ни для каких исключений, которые, однако, вполне могут быть переданы. В таком случае исключение приводит к вызову функции terminate()
, которая (как правило) и завершает работу программы.
Важно понимать, что исключения прерывают нормальный поток программы. В месте, где происходит исключение, некоторые из действий, ожидаемых вызывающей стороной, могут быть выполнены, а другие нет. Как правило, пропуск части программы может означать, что объект останется в недопустимом или неполном состоянии, либо что ресурс не будет освобожден и т.д. Программы, которые правильно "зачищают" объекты во время обработки исключений, называют устойчивыми к исключениям (exception safe). Написание устойчивого к исключениям кода чрезвычайно сложно и практически не рассматривается в данном вводном курсе.
Некоторые программы используют исключения просто для завершения программы в случае проблем. Такие программы вообще не заботятся об устойчивости к исключениям.
Программы, которые действительно обрабатывают исключения и продолжают работу, должны постоянно знать, какое исключение может произойти и что программа должна делать для гарантии допустимости объектов, невозможности утечки ресурсов и восстановления программы в корректном состоянии.
Некоторые из наиболее популярных методик обеспечения устойчивости к исключениям здесь будут упомянуты. Однако читатели, программы которых требуют надежной обработки исключений, должны знать, что рассматриваемых здесь методик недостаточно для полного обеспечения устойчивости к исключениям.
5.6.3. Стандартные исключения
В библиотеке С++ определен набор классов, объекты которых можно использовать для передачи сообщений о проблемах в функциях, определенных в стандартной библиотеке. Эти стандартные классы исключений могут быть также использованы в программах, создаваемых разработчиком. Библиотечные классы исключений определены в четырех следующих заголовках.
• В заголовке exception
определен общий класс исключения exception
. Он сообщает только о том, что исключение произошло, но не предоставляет никакой дополнительной информации.
• В заголовке stdexcept
определено несколько универсальных классов исключения (табл. 5.1).
• В заголовке new
определен класс исключения bad_alloc
, рассматриваемый в разделе 12.1.2.
• В заголовке type_info
определен класс исключения bad_cast
, рассматриваемый в разделе 19.2.
В классах exception
, bad_alloc
и bad_cast
определен только стандартный конструктор (см. раздел 2.2.1), поэтому невозможно инициализировать объект этих типов.
Поведение исключений других типов прямо противоположно: их можно инициализировать объектом класса string
или строкой в стиле С, однако значением по умолчанию их инициализировать нельзя. При создании объекта исключения любого из этих типов необходимо предоставить инициализатор. Этот инициализатор используется для предоставления дополнительной информации о произошедшей ошибке.
Интервал:
Закладка: