Чтение онлайн

на главную - закладки

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

void error(string s1, string s2)

{

throw runtime_error(s1+s2);

}

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

Обратите внимание на то, что использование функции

error
не зависит от количества ее предыдущих вызовов: функция
error
всегда находит ближайший раздел
catch
, предусмотренный для перехвата исключения
runtime_error
(обычно
один из них размещается в функции
main
). Примеры использования исключений и функции
error
приведены в разделах 7.3. и 7.7. Если исключение осталось неперехваченным, то система выдаст сообщение об ошибке (неперехваченное исключение).

ПОПРОБУЙТЕ

Для того чтобы увидеть неперехваченное исключение, запустите небольшую программу, в которой функция

error
не перехватывает никаких исключений.

5.6.4. Суживающие преобразования

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

int x = 2.9;

char c = 1066;

Здесь
x
будет равно
2
, а не
2.9
, поскольку переменная
x
имеет тип
int
, а такие числа не могут иметь дробных частей. Аналогично, если используется обычный набор символов ASCII, то переменная
c
будет равна
42
(что соответствует символу
*
), а не
1066
, поскольку переменные типа
char
не могут принимать такие большие значения.

В разделе 3.9.2 показано, как защититься от такого сужения путем проверки. С помощью исключений (и шаблонов; см. раздел 19.3) можно написать функцию, проверяющую и генерирующую исключение

runtime_exception
, если присваивание или инициализация может привести к изменению значения. Рассмотрим пример.

int x1 = narrow_cast<int>(2.9); // генерирует исключение

int x2 = narrow_cast<int>(2.0); // OK

char c1 = narrow_cast<char>(1066); // генерирует исключение

char c2 = narrow_cast<char>(85); // OK

Угловые скобки,

<...>
, означают то же самое, что и в выражении
vector<int>
. Они используются, когда для выражения идеи возникает необходимость указать тип, а не значение. Аргументы, стоящие в угловых скобках, называют шаблонными (template arguments). Если необходимо преобразовать значение и мы не уверены, что оно поместится, то можно использовать тип
narrow_cast
, определенный в заголовочном файле
std_lib_facilities.h
и реализованный с помощью функции
error
. Слово
cast
[7] означает приведение типа и отражает роль этой операции в ситуации, когда что-то “сломалось” (по аналогии с гипсовой повязкой на сломанной ноге). Обратите внимание на то, что приведение типа не изменяет операнд, а создает
новое значение, имеющее тип, указанный в угловых скобках и соответствующий операнду.

7

Буквально гипсовая повязка. — Примеч. ред.

5.7. Логические ошибки

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

if
или что-нибудь еще. Логические ошибки обычно труднее всего находить и исправлять, поскольку на этой стадии компьютер делает только то, что вы сами ему приказали. Теперь ваша задача выяснить, почему он делает не то, что вы хотели. В принципе компьютер — это очень быстро действующий идиот. Он просто покорно делает в точности то, что вы ему сказали.

Попробуем проиллюстрировать сказанное на простом примере. Рассмотрим программу-код для поиска минимальной, максимальной и средней температуры.

int main

{

vector<double> temps; // температуры

double temp = 0;

double sum = 0;

double high_temp = 0;

double low_temp = 0;

while (cin>>temp) // считываем и записываем в вектор temps

temps.push_back(temp);

for (int i = 0; i<temps.size; ++i)

{

if(temps[i] > high_temp) high_temp = temps[i]; // находим
максимум

if(temps[i] < low_temp) low_temp = temps[i]; // находим
минимум

sum += temps[i]; // вычисляем сумму

}

cout << "Максимальная температура: " << high_temp<< endl;

cout << "Минимальная температура: " << low_temp << endl;

cout << "Средняя температура:" << sum/temps.size << endl;

}

Мы проверили эту программу, введя почасовые данные о температуре в центре Люббока, штат Техас (Lubbock, Texas) 16 февраля 2005 года (в штате Техас по-прежнему используется шкала Фаренгейта).

–16.5, –23.2, –24.0, –25.7, –26.1, –18.6, –9.7, –2.4,

7.5, 12.6, 23.8, 25.3, 28.0, 34.8, 36.7, 41.5,

40.3, 42.6, 39.7, 35.4, 12.6, 6.5, –3.7, –14.3

Результаты оказались следующими:

Максимальная температура: 42.6

Минимальная температура: –26.1

Средняя температура: 9.3

Наивный программист может прийти к выводу, что программа работает просто отлично. Безответственный программист продаст ее заказчику. Благоразумный программист проверит программу еще раз. Для этого мы ввели данные, полученные 23 июля 2005 года.

Поделиться:
Популярные книги

Без шансов

Семенов Павел
2. Пробуждение Системы
Фантастика:
боевая фантастика
рпг
постапокалипсис
5.00
рейтинг книги
Без шансов

Назад в ссср 6

Дамиров Рафаэль
6. Курсант
Фантастика:
попаданцы
альтернативная история
6.00
рейтинг книги
Назад в ссср 6

Идеальный мир для Лекаря 13

Сапфир Олег
13. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 13

Не грози Дубровскому! Том V

Панарин Антон
5. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому! Том V

Морозная гряда. Первый пояс

Игнатов Михаил Павлович
3. Путь
Фантастика:
фэнтези
7.91
рейтинг книги
Морозная гряда. Первый пояс

Лишняя дочь

Nata Zzika
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Лишняя дочь

Не грози Дубровскому! Том II

Панарин Антон
2. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому! Том II

На границе империй. Том 9. Часть 3

INDIGO
16. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 3

Мастер 2

Чащин Валерий
2. Мастер
Фантастика:
фэнтези
городское фэнтези
попаданцы
технофэнтези
4.50
рейтинг книги
Мастер 2

Его маленькая большая женщина

Резник Юлия
Любовные романы:
современные любовные романы
эро литература
8.78
рейтинг книги
Его маленькая большая женщина

Царь поневоле. Том 2

Распопов Дмитрий Викторович
5. Фараон
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Царь поневоле. Том 2

Кодекс Крови. Книга I

Борзых М.
1. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга I

Второй Карибский кризис 1978

Арх Максим
11. Регрессор в СССР
Фантастика:
попаданцы
альтернативная история
5.80
рейтинг книги
Второй Карибский кризис 1978

Ведьма

Резник Юлия
Любовные романы:
современные любовные романы
эро литература
8.54
рейтинг книги
Ведьма