Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекция № 3 (слайды)

.pdf
Скачиваний:
9
Добавлен:
31.03.2015
Размер:
407.93 Кб
Скачать

Технические детали

1.Обработка ошибок

2.Пользовательские типы данных

3.Ввод и вывод

Курс «Технология программирования»

Кафедра управления и информатики НИУ «МЭИ»

Осенний семестр 2014 г.

Подходы к обработке ошибок

• Возврат кода ошибки:

int convert_temperature ( double temperature, char from, char to, double& result );

double kelvins;

if (convert_temperature ( celsius,

// Произошла ошибка.

Код Ошибка

0Нет ошибки.

1Неизвестная шкала from.

2Неизвестная шкала to.

3temperature < 0 °K

'C', 'K' , kelvins ) )

• Доступ к коду последней ошибки:

double convert_temperature (

double temperature, char from, char to ); int get_last_error ();

double kelvins = convert_temperature ( celsius, 'C', 'K' ); if ( get_last_error () )

// Произошла ошибка.

11.09.2014

© Кафедра УиИ НИУ «МЭИ»

2

Проблемы обработки ошибок

Что плохо (challenges)?

Проверку ошибок легко забыть.

Обработка ошибок загромождает реализацию алгоритма.

Лавинообразный рост сложности обработки ошибок при вложенных вызовах.

Причину ошибки трудно уточнить.

Чего хочется (ideals)?

Ошибка должна требовать обработки.

Или ошибка обработана, или программа завершается.

Сосредоточить код проверки в одной точке.

Автоматический переход к обработке при ошибках.

Доступ к информации о причинах ошибки.

11.09.2014

© Кафедра УиИ НИУ «МЭИ»

3

Исключения (exceptions)

Блок, где возможны ошибки.

Блок

обработки

ошибок.

Ключевое слово «».

 

Информация

 

об ошибке

try

try

(«исключение»).

 

 

{

{

 

 

vector<double> xs;

vector<double> xs;

xs [ 0 ] = 0;

xs [ 0 ] = 0;

 

 

}

}

 

 

catch ()

catch (exceptionconst

eptionrror)& error)

{

 

 

 

{

 

 

cout << "Error!\n";

cout << error . what() << '\n';

}

}

 

 

 

«Index out of range (index: 0, size: 0)».

Обработка ошибок

Автоматический

Доступна информация

в одном блоке.

переход к обработке.

о причинах ошибки.

11.09.2014

© Кафедра УиИ НИУ «МЭИ»

4

Распространение исключений

try

{

cout << volume(1, −2, 3);

}

catch (const exception& e)

{

cout << e.what();

}

double area (

double width, double height )

{

if (width < 0) error ( "area: width < 0" ); if (height < 0) error ( "area: height < 0" ); return width * height;

}

Где catch?

double volume(

double width, double height, double depth )

{

if (depth < 0) error ( "volume: depth < 0" ); return area ( width, height ) * depth;

}

Обработка

ошибок остается простой даже в сложной программе.

11.09.2014

© Кафедра УиИ НИУ «МЭИ»

5

Возбуждение, перехват и типы исключений

error ( "сообщение об ошибке" );

throw исключение(…);

Учебная, определена в sdt.h. Типовая:

добавляет имя файла;

добавляет номер строки.

invalid_argument("width < 0");

Длина меньше нуля и т. п.

logic_error("логическая ошибка");

Корреляция между векторами неравной длины и т. п.

Блоков catch может быть несколько:

catch (invalid_argument e)

{ … }

catch (logic_error e)

{ … }

catch (runtime_error e)

{ … }

catch (exception e)

{ … }

catch ()

{ … }

Порядок важен:

от конкретной ошибки к более общей.

Иерархия ошибок — в «C++ Reference».

11.09.2014

© Кафедра УиИ НИУ «МЭИ»

6

Структуры

В пером приближении — записи Pascal (record).

Хранят несколько значений вместе.

struct Temperature

{

 

 

 

 

 

data . scale

double value;

 

 

 

 

 

 

 

 

 

 

char scale;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

};

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

data . value

Temperature data;

 

 

 

 

data . value = 273.15;

 

 

 

 

 

 

 

 

 

 

data . scale = 'K';

 

 

 

 

 

data

 

 

 

 

 

 

Как выводить структуры?

Как вводить структуры?

Как работать со структурами?

11.09.2014

© Кафедра УиИ НИУ «МЭИ»

7

Вывод пользовательских типов

сокращенная

Специальное имя функции.

 

форма записи

 

cout << x;

 

operator<< ( cout, x);

cout << x << y;

 

operator<< (operator<< ( cout, x ), y);

1 + 2 + 3

 

(1 + 2) + 3

 

ostream& operator << (

тип cout*

ostream& output, const Temperature& data)

{

}

* На самом деле, нет.

output << data . value << data . scale; return output;

cout << data; // 237.15K

11.09.2014

© Кафедра УиИ НИУ «МЭИ»

8

Ввод пользовательских типов

тип cin*

Ссылка не const, так как data изменяется.

 

istream& operator>> (

istream& input, Temperature& data )

Здесь можно выполнить

{

 

 

преобразования

input >> data . value >> data . scale;

и проверку ввода.

 

 

if (data . scale != 'K' || data . value < 0) {

Как сообщить

input . setstate ( ios_base :: failbit );

об ошибке?..

}

 

 

 

 

 

 

return input;

Temperature data;

 

}

А чтобы это

 

while (cin >> data) { … }

 

работало?

 

 

 

if ( ! (cin >> data)) {

 

 

 

cout << "Incorrect temperature input!";

Окончание ввода cin отследит.

 

}

 

 

11.09.2014

© Кафедра УиИ НИУ «МЭИ»

9

Перегрузка операторов

×Не делается проверок.

×Много полей — путаница. Работает сразу.

Temperature boiling { 100, 'C' };

if (data > boiling) { … }

Temperature mean { 0, 'C' }; mean = mean + data;

+= — отдельный оператор!

Одинаковый способ.

«Left-Hand Side» и «Right-Hand Side»

bool operator > ( const Temperature& lhs, const Temperature& rhs)

{

return lhs . value > rhs . value;

}

Temperature operator + ( const Temperature& lhs, const Temperature& rhs)

{

return {

lhs . value + rhs . value, lhs . scale

};

}

11.09.2014

© Кафедра УиИ НИУ «МЭИ»

10