Камерон Хьюз - Параллельное и распределенное программирование на С++
- Название:Параллельное и распределенное программирование на С++
- Автор:
- Жанр:
- Издательство:Издательский дом «Вильямс»
- Год:2004
- Город:МоскваСанкт-ПетербургКиев
- ISBN:ISBN 5-8459-0686-5 (рус.)ISBN 0-13-101376-9 (англ.)
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Камерон Хьюз - Параллельное и распределенное программирование на С++ краткое содержание
Эта книга адресована программистам, проектировщикам и разработчикам программных продуктов, а также научным работникам, преподавателям и студентам, которых интересует введение в параллельное и распределенное программирование с использованием языка С++.
Параллельное и распределенное программирование на С++ - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
// Листинг 7.2. Использование шаблона в функции // importantOperation()
template int importantOperation(void) {
T ErrorTable; //.. .
U *Solver; //...
Solver = ErrorTable[Result]; Solver->doSomething () ; //...
};
В листинге 7.2 тип ErrorTableне ограничен объекта м и класса defect_response.Этот метод позволяет упростить код обработки ошибок и повысить его гибкость. Здесь демонстрируется использование полиморфизма как по вертикали, так и по горизонтали, что чрезвычайно важно для SPMD- и MPMD-программ. Как упростить программы, реализующие параллелизм с помощью шаблонов и полиморфизма, описано в главе 9. Использование объектов отображения и объектов обработки ошибок — это важнал составляющал повышения надежности ПО. Помимо методов обработки ошибок, мы можем также воспользоваться преимуществами механизма обработки исключительных ситуаций и классов исключений, прелусмотренных в С++ (этому посвящен следующий раздел).
Механизмы обработки исключительных ситуаций в С++
В идеале во время тестирования и отладки должны быть ликвидированы все дефекты протраммы или по крайней мере максимально возможное их количество. Кроме того, следует обработать нежелательные и неудобные условия с использованием обычной программной логики. После устранения всех (или почти всех) дефектов и обработки нежелательных и неудобных условий все остальные «неприятности» попадают в разряд исключительных ситуаций. Обработка исключительных ситуаций в С++ по д держивается с помощью трех ключевых слов: try, throwи catch.Любой код, сталкивающийся сисключительной ситуацией, с которой он не в силах справиться самостоятельно, генерирует исключение «в надежде» на то, что с ней совладает некоторый другой обработчик (расположенный где-то в другом месте программы) (Б. Страуструп, Язык программирования С++ , 1997). Для генерирования объекта некоторого специального типа (типа исключения) используется ключевое слово throw.При этом происходит передача управления обработчику исключения, который предназначен д л я обработки объектов данного типа. Д л я идентификации обработчиков, предназначенных д л я перехвата объектов исключений, используется ключевое слово catch.Рассмотрим пример.
void importantOperation {
/ / executeImportCode ()
// Возникает исключительная ситуация.
impossible_condition ImpossibleCondition;
throw ImpossibleCondition;
//...
}
catch (impossible_condition &E) {
// Выполнение действий, связанный с объектом E.
//...
}
Функция importantOperation() пытается выполнить свою работу и сталкивается с необычными условиями, с которыми она не в состоянии справиться. В нашем примере она создает объект типа impossible_conditionи использует ключевое слово throwдля генерирования этого объекта. Блок кода, в котором используется ключевое слово catch,предназначен для перехвата объектов типа impossible_condition.Этот блок кода называется обработчиком исключений. Обработчики исключений связаны с блоками кода, поме щ енными в try-выражения. Назначение try-блоков — обозначить область, в которой возможно возникновение исключительной ситуации. Блок catchдолжен сразу же следовать за соответствующим try-блоком или другим catch-блоком. Вот пример:
try{
//...
importantOperation();
//. . .
}
catch(impossible_condition &E) {
// Выполнение действий, связанных с объектом E.
// - . .
Здесь при выполнении функции importantOperation()возможно возникновение условий, с которыми она не в состоянии справиться. В этом случае функция сгенерирует исключение, в результате чего управление будет передано первому обработчику, который принимает объект исключений типа impossible_condition.Этот обработчик либо сам справится с этой исключительной ситуацией, либо сгенерирует исключение, с которым придется иметь дело другому обработчику исключений. Объекты, генерируемые при исключительных ситуациях, могут быть определены пользователем, причем они могут просто содержать коды ошибок или сообщения об ошибках, которые способны помочь обработчику исключений выполнить его работу. Если бы мы использовали объекты, подобные объектам типа exception_responseиз листингов 7.1 и 7.2, то обработчик исключений мог бы применить их для решения проблемы либо для восстановления работоспособного состояния программы. Для создания объектов исключений можно также использовать встроенные С++-классы исключений.
Классы исключений
Стандартная библиотека классов С++ содержит девять классов исключений, разделенных на две основные группы (группа динамических ошибок и группа логических ошибок), которые приведены в табл. 7.3. Группа динамических ошибок представляет ошибки, которые трудно предотвратить. В группу логических ошибок входят ошибки, которые «теоретически предотвратимы».
Таблица7.3. Классы ди н амических и логических ошибок | |
Классы динамических ошибок | Классы логических ошибок |
range_error | domain_error |
underflow_error | invalid_argument |
overflow_error | length_error |
out_of_range |
Классы runtime__error
На рис. 7.4 показана схема отношений между классами для семейства классов runtime_error. Это семейство выведено из класса exception. Из класса runtime_error выведено три класса: range_error, overflow_error Hunderflow_error, которые сооб щ ают об ошибках промежуточных вычислений (об ошибках выхода за границы диапазона, переполнения и потери значимости). Потомки класса runtime_error наслелуют основное поведение от своего предка, класса exception (имеется в виду метод what (), оператор присваивания operator= () и конструкторы класса обработки исключений).
Рис. 7.4. Схема отношений между классами для семейства классов runtime_error |
Каждый класс обеспечивает определен н ый диапазон наслелуемых функций, которыми программист может воспользоваться для конкретной программы. Например, классы defect_responseи exception_response,созданные в листингах 7.1 и 7.2, можно вывести как из класса runtime_error,так и из класса logic_error.Но сначала полезно рассмотреть работу базовых классов исключений без специализации. В листинге 7.3 показано, как можно сгенерировать объекты классов exceptionи logic__error.
// Листинг 7.3. Генерирование объекта класса exception и
// объекта класса logic_error
try{
exception X; throw(X) ;
} catch(const exception &X) {
cout « X.what() << endl;
}
try{
Интервал:
Закладка: