Программирование. Принципы и практика использования C++ Исправленное издание, стр. 65
// об ошибках, // возникших в функции area() // Вычисляет площадь прямоугольника; // при неправильном аргументе генерирует исключение Bad_areaint area(int length, int width){ if (length<=0 || width<=0) throw Bad_area(); return length*width;}Иначе говоря, если аргументы правильные, то программа всегда возвращает площадь прямоугольника, а если нет, то выходим из функции
area()throwcatchBad_areaarea()catcharea()Bad_area()throw Bad_area()Bad_areathrowТеперь функцию можно написать так:
int main()try { int x = –1; int y = 2; int z = 4; // ... int area1 = area(x,y); int area2 = framed_area(1,z); int area3 = framed_area(y,z); double ratio = area1/area3;}catch (Bad_area) { cout << "Ой! Неправильный аргумент функции area()\n";}Во-первых, этот фрагмент программы обрабатывает все вызовы функции
area()main()framed_area()main()throw Bad_area()area()Bad_area5.6.2. Ошибки, связанные с диапазоном
Большинство реальных программ работает с наборами данных. Иначе говоря, они используют разнообразные таблицы, списки и другие структуры данных. В контексте языка С++ наборы данных часто называют контейнерами (containers). Наиболее часто используемым контейнером стандартной библиотеки является тип vector, введенный в разделе 4.6.
Объект типа
vectorsize()[0:v.size()][low:high]high-1
Прежде чем ответить на этот вопрос, необходимо ответить на другой: “Как это может быть?” Помимо всего прочего, известно, что индекс вектора
v[0:v.size()]Легко сказать, но трудно сделать. Рассмотрим следующую вполне разумную программу:
vector<int> v; // вектор целых чиселint i;while (cin>>i) v.push_back(i); // вводим значения в контейнерfor (int i = 0; i<=v.size(); ++i) // печатаем значения cout << "v[" << i <<"] == " << v[i] << endl;Видите ошибку? Попытайтесь найти ее, прежде чем двигаться дальше. Эта довольно типичная ошибка. Мы часто ее делаем, особенно если программируем поздно ночью, когда устали. Ошибки, как правило, являются результатом спешки или усталости.
Мы использовали
0size()iv[i]fori<=v.size()i<v.size()v[5]Эту ошибку можно спровоцировать намного проще.
vector<int> v(5);int x = v[5];Однако мы сомневаемся, что вы признаете такой пример реалистичным и заслуживающим внимания. Итак, что же произойдет на самом деле, если мы сделаем ошибку диапазона? Операция доступа по индексу в классе
vectorout_of_range