Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 [ 8 ] 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239

В заголовочных файлах все идентификаторы объявляются в пространстве имен std.

Одно из преимуществ новой схемы выбора имен заключается в том, что она позволяет легко отличить старый заголовочный файл для строковых функций char* от стандартного заголовочного файла С++ для работы с классом string:

linclude <string> Класс string языка С++

linclude <cstring> Функции ctiar* языка С

Впрочем, новая схема именования заголовочных файлов вовсе не означает, ЧТО файлы стандартных заголовков не имеют расширений с точки зрения операционной системы. Правила обработки команд include для стандартных заголовочных файлов определяются реализацией. Скажем, системы программирования С++ могут добавлять расширения и даже использовать стандартные объявления без загрузки файла. Но на практике большинство систем просто включает заголовок из файла, имя которого точно совпадает с именем, указанным в команде include. Следовательно, в большинстве систем стандартные заголовочные файлы С++ пе имеют расширений. Помните, что требование об отсутствии расширения относится только к стандартным заголовочным файлам. В общем случае рекомендуется снабжать заголовочные файлы расширениями, чтобы упростить их идентификацию в файловой системе.

Для сохранения совместимости с С оставлена поддержка «старых» стандартных заголовочных файлов С. Если потребуется, вы можете использовать команду

#include <stdlib.h>

В этом случае идентификаторы объявляются как в глобальной области видимости, так и в пространстве имен std. На практике все выглядит так, словно идентификаторы объявлены в пространстве имен std, после чего была выполнена директива using (см. с. 33).

Спецификация заголовочных файлов С++ «старого» формата (например, <iostream.h>) в стандарте отсутствует; кстати, это решение неоднократно менялось в процессе стандартизации. Таким образом, старые заголовочные файлы официально не поддерживаются. Вероятно, на практике большинство поставщиков будут предоставлять их для обратной совместимости. Однако изменения в заголовках не ограничиваются введением пространства имен std, поэтому в общем случае следует либо использовать старые имена заголовочных файлов, либо переключиться на новые стандартизированные имена.

Обработка ошибок и исключений

Стандартная библиотека С++ неоднородна. Она содержит программный код из множества разных источников, отличающихся по стилю проектирования и реализации. Типичным примером таких различий является обработка ошибок и исключений. Одни части библиотеки - например, строковые классы - поддерживают подробную обработку ошибок. Они проверяют все возможные проблемы, которые могут возникнуть в работе программы, и генерируют исключение в случае ошибки. Другие компоненты - например, стандартная библиотека шабло-



нов STL и массивы valarray - оптимизируются по скорости, поэтому они редко проверяют логические ошибки и выдают исключения только в случае ошибок времени выполнения.

Стандартные классы исключений

Все исключения, генерируемые языком или библиотекой, происходят от общего предка - базового класса exception. Этот класс является корнем иерархического дерева исключений, изображенного на рис. 3.1. Стандартные классы исключений делятся на три категории:

О исключения языковой поддержки;

О исключения стандартной библиотеки С++;

О исключения внешних ошибок.

•xcaption -

bad alloc

bad cast

bad typeid

logicarror

domain error

i nva 1 id argumen t

lan9th arror

ou t o £ r ang*

los bas«::failure

runtiiM «rror

b adaxcapti on

rang« arror

overflow arror

underflow error

Рис 3.1. Иерархия стандартных исключений

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

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

О Исключение класса Ьас1 а11ос генерируется при неудачном выполнении глобального оператора new (кроме версии new с запретом исключений). Вероятно, это самое важное исключение, поскольку в любой нетривиальной программе оно может возникнуть в любой момент.

О Исключение класса bad cast генерируется оператором dynamic cast, если преобразование типа по ссылке во время выполнения завершается неудачей. Оператор dynamic cast описан на с. 35.



О Исключение класса bad typeid генерируется оператором typeid, предназначенным для идентификации типов во время выполнения. Если аргументом typeid является ноль или null-указатель, генерируется исключение.

О Исключение класса bad exception предназначено для обработки непредвиденных исключений. В его обработке задействована функция unexpecbed(), которая вызывается при возникновении исключений, ие входящих в спецификацию исключений соответствующей функции (спецификации исключений рассматриваются на с. 32). Пример:

class El class Е2

void f() throw(El) {

throw ElO: throw E2():

Исключение типа E2 нарушает спецификацию исключений функции f(). В этом случае будет вызвана функция unexpected(), которая обычно передает управление функции terminateO для завершения программы. Но при включении в спецификацию исключений класса bad exception функция unexpected() обычно перезапускает исключение этого типа:

class El class Е2

void f() throw(El,std::bad exception)

Генерирует исключения типа El или

bad exception для всех остальных типов исключений

throw Е1С); Генерирует исключение типа Е1

throw Е2(): Вызывает функцию unexpectedC). } которая генерирует bad exception

Итак, если спецификация исключений содержит класс bad exception, то функция unexpectedO может заменить исключением bad exceptlon любое исключение, не входящее в спецификацию.

Классы исключений стандартной библиотеки

Классы исключений стандартной библиотеки С++ обычно являются производными от класса logic error. К категории логических ошибок относятся ошибки, которые (по крайней мере, теоретически) можно предотвратить, например, до-

Поведение функции unexpecced() можно переопределить. Тем не менее функция никогда не генерирует исключения, не указанные в спецификации исключений (если она есть).



0 1 2 3 4 5 6 7 [ 8 ] 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239