SlideShare a Scribd company logo
Углубленное программирование
на языке C++
Алексей Петров
Лекция №3. Шаблоны классов и методов.
Обработка исключительных ситуаций.
Обобщенное и безопасное
программирование
• Шаблоны классов и методов.
• Обобщенное программирование.
• Параметры шаблонов.
• Специализация, конкретизация и перегрузка шаблонов.
• Понятие, поддержка и технология обработки исключительных
ситуаций.
• Безопасное программирование.
• Нейтральность кода.
• Критерии безопасности и нейтральности классов и методов.
• Безопасность конструкторов и деструкторов.
• Исключения в стандартной библиотеке.
Шаблоны классов (1 / 2)
Шаблон класса — элемент языка, позволяющий параметризовать
типы и значения, используемые для автоматического создания
(конкретизации) классов по обобщенному описанию (шаблону).
Использование шаблонов классов является первым шагом на пути к
обобщенному программированию.
Различают объявления и определения шаблонов классов. В отличие
от «обычного» класса объявления и определения шаблона содержат
списки параметров шаблона, среди которых выделяются параметры-
типы и параметры-константы.
Параметры-типы шаблона класса представляют некоторый тип данных,
параметры-константы — некоторое константное (вычисляемое при
компиляции) выражение.
Шаблоны классов (2 / 2)
Например:
template <class T, class U, int size>
// template <typename T, typename U, int size>
class TestCase
{
public:
TestCase() : _size(size) // …
private:
T _prm_1;
U* _prm_2;
int _size;
};
Параметры шаблонов
классов
Параметры шаблона класса не могут быть одноименными члену
соответствующего шаблона.
Имя параметра шаблона может присутствовать в списке параметров
лишь один раз.
Имена параметров в объявлении (если есть) и определении шаблона
могут различаться.
Параметры могут иметь значения по умолчанию.
Константные выражения с одинаковыми значениями трактуются как
эквивалентные параметры-константы шаблонов классов.
Конкретизация шаблонов
классов
Конкретизация шаблона — это автоматическая генерация исходного
кода конкретного класса в соответствии с заданным программистом
определением шаблона класса.
Конкретизированный шаблон может использоваться везде, где
допустимо использование «обычного» класса (включая объявления и
определения шаблонов функций), а экземпляры автоматически
сгенерированного класса — везде, где допустимы «обычные» объекты.
Шаблон класса конкретизируется тогда, когда впервые требуется
определение автоматически генерируемого класса.
Например:
TestCase<int, double, 10> tc1;
Методы шаблонов классов
Методы шаблонов классов также являются шаблонами и
конкретизируются в точке вызова или взятия адреса. При этом
конкретизируемый метод относится к тому классу, через объект
которого вызывается.
Например:
template <class T, class U, int size>
TestCase<T, U, size>::~TestCase()
{
/* … */
}
Дружественные объекты
в шаблонах классов
Дружественными по отношению к шаблонам классов могут быть:
• «обычная» дружественная функция (не шаблон);
• «обычный» дружественный класс (не шаблон);
• связанный шаблон дружественной функции, взаимно однозначно
соответствующий шаблону класса (с общим для обоих шаблонов
списком параметров);
• связанный шаблон дружественного класса, взаимно однозначно
соответствующий шаблону класса (с общим для обоих шаблонов
списком параметров);
• несвязанный шаблон дружественной функции, соответствующий
всем возможным конкретизациям шаблона класса (с раздельными
списками параметров);
• несвязанный шаблон дружественного класса, соответствующий
всем возможным конкретизациям шаблона класса (с раздельными
списками параметров).
Статические члены
шаблонов классов
Шаблоны классов могут содержать статические члены данных,
собственный набор которых имеет каждый конкретизированный
согласно шаблону класс.
Например:
template <class T, class U, int size>
class TestCase
{ /* … */
private:
static TestCase *_head;
};
template <class T, class U, int size>
TestCase<T, U, size>
*TestCase<T, U, size>::_head = NULL;
Специализация шаблонов
классов (1 / 3)
Шаблоны классов в языке C++ допускают частичную (полную)
специализацию, при которой отдельные (все) параметры шаблона
заменены конкретными именами типов или значениями константных
выражений.
Например (специализация члена класса):
template<>
void TestCase<int, double, 10>::foo()
{
/* … */
}
Специализация шаблонов
классов (2 / 3)
Например (полная специализация класса):
template<> class TestCase<int, double, 100>
{
public:
TestCase<int, double, 100>();
~TestCase<int, double, 100>();
void foo();
/* … */
};
Специализация шаблонов
классов (3 / 3)
Например (частичная специализация класса):
template <class T, class U>
class TestCase<T, U, 100>
{
public:
TestCase();
~TestCase ();
/* … */
};
Понятие исключительных
ситуаций (1 / 2)
Естественный порядок функционирование программ нарушают
возникающие нештатные ситуации, в большинстве случаев
связанные с ошибками времени выполнения (иногда — с
необходимостью внезапно переключить контекст приложения).
В языке C++ такие нештатные ситуации называются
исключительными (иначе говоря — исключениями).
Примерами исключительных ситуаций являются:
• нехватка оперативной памяти;
• попытка доступа к элементу коллекции по некорректному индексу;
• попытка недопустимого преобразования динамических типов и пр.
Понятие исключительных
ситуаций (2 / 2)
Архитектурной особенностью механизма обработки исключительных
ситуаций в языке C++ является принципиальная независимость
(несвязность) фрагментов программы, где исключение возбуждается и
где оно обрабатывается.
Обработка исключительных ситуаций носит невозвратный характер.
Объекты-исключения.
Оператор throw
Носителями информации об аномальной ситуации (исключении) в C++
являются объекты заранее выбранных на эту роль типов
(пользовательских или — Sic! — базовых, например, char*). Такие
объекты называются объектами-исключениями.
Жизненный цикл объектов-исключений начинается с возбуждения
исключительной ситуации посредством оператора throw, например:
throw "Illegal cast"; // char *
/* … */
throw IllegalCast(); // class IllegalCast
/* … */
enum EPrgStatus
{psOK, psBadIndex, psIllegalCast};
throw psIllegalCast; // enum EPrgStatus
Защищенные блоки.
Операторы try, catch (1 / 2)
Небезопасные с точки зрения исключений фрагменты кода должны
инкапсулироваться в защищенный (контролируемый) блок, за которым
следует один или несколько ассоциированных с ним блоков-
обработчиков исключений.
Защищенные блоки кода начинаются ключевым словом try, блоки-
обработчики — словом catch.
При возбуждении исключения в одном из операторов защищенного
блока все следующие за ним операторы блока автоматически
пропускаются, а управление передается ближайшему
соответствующему блоку-обработчику исключения. Если такой блок не
найден, управление берет на себя стандартная функция terminate().
Иначе обработку исключительной ситуации берет на себя первый
подходящий для этого блок в порядке их указания в исходном коде.
Защищенные блоки.
Операторы try, catch (2 / 2)
Например:
void foo()
{ /* … */
throw "Illegal id";
/* … */ // не выполняется
}
void bar()
{
try {
foo();
/* … */ // не выполняется
}
catch(char *s) {
cout << s << endl;
}
}
Функциональные
защищенные блоки
Как защищенный блок может быть оформлена не только часть
функции, но и функция целиком (в том числе main() и конструкторы
классов). В таком случае защищенный блок называют
функциональным. Например:
void foobar()
try {
/* … */
}
catch( /* … */ ) { /* … */ }
catch( /* … */ ) { /* … */ }
catch( /* … */ ) { /* … */ }
Варианты объявления
исключений
Объявление исключения в блоке-обработчике может быть
объявлением типа, объекта, ссылки или указателя на объект.
Например:
catch(IllegalCast) { /* … */ }
catch(IllegalCast ic) { /* … */ }
catch(IllegalCast &ric) { /* … */ }
catch(IllegalCast *pic) { /* … */ }
Раскрутка стека
и уничтожение объектов
Поиск catch-блока, пригодного для обработки возбужденного
исключения, приводит к раскрутке стека — последовательному выходу
из составных операторов и определений функций.
В ходе раскрутки стека происходит уничтожение локальных
объектов, определенных в покидаемых областях видимости. При этом
деструкторы локальных объектов вызываются штатным образом
(строгая гарантия C++).
Исключение, для обработки которого не найден catch-блок, инициирует
запуск функции terminate(), передающей управление функции abort(),
которая аварийно завершает программу.
Повторное возбуждение
исключения и универсальный
блок-обработчик
Оператор throw без параметров помещается (только) в catch-блок и
повторно возбуждает обрабатываемое исключение. При этом его копия
не создается:
throw;
Особая форма блока-обработчика исключений осуществляет перехват
любых исключений:
catch(...) { /* … */ };
Безопасность ПО
как показатель качества
В «промышленном программировании» безопасность ПО
рассматривается как один из структурных показателей качества
продукта, оцениваемый путем статического анализа архитектуры,
состава используемых компонентов, исходного кода и схемы БД.
Примечание: См. модель SQuaRE, описанную в международных
стандартах ISO/IEC 9126-3 “Software Engineering — Product Quality” и
ISO 25000:2005 “Software Engineering — Software product Quality
Requirements and Evaluation (SQuaRE) — Guide to SQuaRE”.
Для обеспечения «структурной безопасности» исходного кода
необходимо соблюдение стандартов разработки архитектуры и
стандартов кодирования.
Стандарты кодирования —
за «безопасный код»
Структурная безопасность исходного кода ПО требует соблюдения
определенных техник кодирования, одной из которых является
систематическая обработка ошибок и исключительных ситуаций на
всех уровнях архитектуры (уровень представления, уровень бизнес-
логики, уровень (базы) данных).
Одним из элементов обработки ошибок и исключений является
спецификация (ограничение) типов исключений, которые могут
порождать структурные элементы кода.
Безопасность классов и
методов (1 / 2)
Функция C++ безопасна, если не возбуждает никаких исключений
(или, что то же самое, все возбужденные внутри нее исключения
обрабатываются в ее теле).
Класс C++ безопасен, если безопасны все его методы.
В свою очередь, небезопасные функции могут специфицировать
исключения, возбуждением которых (и только их!) способно
завершиться исполнение таких функций. Обнаруженное при
исполнении нарушение гарантии влечет за собой вызов функции
unexpected(), по умолчанию вызывающей terminate().
Виртуальные функции в производных классах могут повторять
спецификации исключений функций в базовых классов или
накладывать более строгие ограничения.
Безопасность классов и
методов (2 / 2)
Например:
// объявления функций
int foo(int &i) throw();
bool bar(char *pc = 0) throw(IllegalCast);
void foobar() throw(IllegalCast, BadIndex);
// определения функции
int foo(int &i) throw()
{ /* … */ }
bool bar(char *pc = 0) throw(IllegalCast)
{ /* … */ }
void foobar() throw(IllegalCast, BadIndex)
{ /* … */ }
Безопасность конструкторов
Конструкторы могут возбуждать исключения, как и другие методы
классов.
Для обработки всех исключений, возникших при исполнении
конструктора, его тело и список инициализации должны быть
совместно помещены в функциональный защищенный блок.
Например:
Beta::Beta(int value)
try
: Alpha(foo(value))
{ // тело конструктора
/* … */
}
catch(...) { /* … */ }
Безопасность деструкторов
Деструкторы классов не должны возбуждать исключения. Одной из
причин этого является необходимость корректного освобождения
ресурсов, занятых массивами и коллекциями объектов.
Если вызываемая в деструкторе функция может возбудить исключение,
деструктор должен перехватить и обработать его (возможно, прервав
программу).
Если возможность реакции на исключение необходима клиентам
класса во время некоторой операции, в его открытом интерфейса
должна быть функция (не деструктор), которая операцию выполняет.
В общем случае деструктор класса может специфицироваться как
throw():
~Alpha() throw();
Безопасность или
нейтральность кода?
От безопасности программного кода важно отличать нейтральность,
под которой, согласно терминологии Г. Саттера (Herb Sutter), следует
понимать способность методов класса прозрачно «пропускать сквозь
себя» объекты-исключения, полученные ими на обработку, но не
предназначенные для них.
Нейтральный метод:
• может обрабатывать исключения;
• должен ретранслировать полученные им исключения методу-
обработчику в неизменном виде и сохранять свою
работоспособность при любых обстоятельствах.
Пользовательские классы
исключительных ситуаций
Для передачи из точки возбуждения исключения в точку его обработки
сведений об условиях возникновения аномалии программист может
определять и использовать собственные классы исключительных
ситуаций.
Такие классы могут быть сколь угодно простыми (включая пустые) или
сложными (содержащими члены данных, конструкторы, деструкторы и
интерфейсные методы).
Исключения в стандартной
библиотеке. Класс exception
Стандартная библиотека языка C++ содержит собственную иерархию
классов исключений, являющихся прямыми или косвенными потомками
базового класса exception.
namespace std {
class exception {
public:
exception() throw();
exception( const exception & ) throw();
exception& operator=(
const exception & ) throw();
virtual ~exception() throw();
virtual const char* what() const throw();
};
}
Потомки класса exception условно представляют две категории ошибок:
логические ошибки и ошибки времени исполнения.
Классы – логические
ошибки (1 / 2)
В число классов категории «логические ошибки» входят базовый
промежуточный класс logic_error, а также производные от него
специализированные классы:
• invalid_argument — ошибка «неверный аргумент»;
• out_of_range — ошибка «вне диапазона»;
• length_error — ошибка «неверная длина»;
• domain_error — ошибка «вне допустимой области».
Классы – логические
ошибки (2 / 2)
logic_error
invalid_argument out_of_range length_error domain_error
Классы – ошибки времени
исполнения (1 / 2)
В число классов категории «ошибки времени исполнения» входят
базовый промежуточный класс runtime_error, а также производные от
него специализированные классы:
• range_error — ошибка диапазона;
• overflow_error — переполнение;
• underflow_error — потеря значимости.
Классы – ошибки времени
исполнения (2 / 2)
runtime_error
range_error overflow_error underflow_error
Прочие классы исключений
стандартной библиотеки
Также производными от exception являются классы bad_alloc и
bad_cast, сигнализирующие об ошибках при выделении динамической
памяти и неудаче при выполнении «ссылочного» варианта операции
dynamic_cast, соответственно.
exception
bad_alloc bad_cast
Классы исключений стандартной
библиотеки: «вид сверху»
exception
invalid_argument out_of_range length_error domain_error range_error overflow_error underflow_error
bad_alloc bad_cast
logic_error runtime_error
Спасибо за внимание
Алексей Петров

More Related Content

Viewers also liked

Java осень 2012 лекция 4
Java осень 2012 лекция 4Java осень 2012 лекция 4
Java осень 2012 лекция 4Technopark
 
Бизнес весна 2014 лекция 3
Бизнес весна 2014 лекция 3Бизнес весна 2014 лекция 3
Бизнес весна 2014 лекция 3Technopark
 
Разработка веб-сервисов осень 2013 лекция 12
Разработка веб-сервисов осень 2013 лекция 12Разработка веб-сервисов осень 2013 лекция 12
Разработка веб-сервисов осень 2013 лекция 12Technopark
 
Java весна 2014 лекция 5
Java весна 2014 лекция 5Java весна 2014 лекция 5
Java весна 2014 лекция 5Technopark
 
Разработка веб-сервисов осень 2013 лекция 7
Разработка веб-сервисов осень 2013 лекция 7Разработка веб-сервисов осень 2013 лекция 7
Разработка веб-сервисов осень 2013 лекция 7Technopark
 
Бизнес весна 2014 лекция 2
Бизнес весна 2014 лекция 2Бизнес весна 2014 лекция 2
Бизнес весна 2014 лекция 2Technopark
 
C++ осень 2013 лекция 1
C++ осень 2013 лекция 1C++ осень 2013 лекция 1
C++ осень 2013 лекция 1Technopark
 
углубленное программирование на C++. лекция no.5 [4.0]
углубленное программирование на C++. лекция no.5 [4.0]углубленное программирование на C++. лекция no.5 [4.0]
углубленное программирование на C++. лекция no.5 [4.0]Technopark
 
C++ весна 2014 лекция 2
C++ весна 2014 лекция 2C++ весна 2014 лекция 2
C++ весна 2014 лекция 2Technopark
 
Web осень 2012 лекция 2
Web осень 2012 лекция 2Web осень 2012 лекция 2
Web осень 2012 лекция 2Technopark
 
Тестирование лекция 2 весна 2014
Тестирование лекция 2 весна 2014Тестирование лекция 2 весна 2014
Тестирование лекция 2 весна 2014Technopark
 
Алгоритмы и структуры данных весна 2014 лекция 3
Алгоритмы и структуры данных весна 2014 лекция 3Алгоритмы и структуры данных весна 2014 лекция 3
Алгоритмы и структуры данных весна 2014 лекция 3Technopark
 
HighLoad весна 2014 лекция 5
HighLoad весна 2014 лекция 5HighLoad весна 2014 лекция 5
HighLoad весна 2014 лекция 5Technopark
 
Проектирование интерфейсов весна 2014 занятие 7
Проектирование интерфейсов весна 2014 занятие 7Проектирование интерфейсов весна 2014 занятие 7
Проектирование интерфейсов весна 2014 занятие 7Technopark
 
Бизнес весна 2014 лекция 6
Бизнес весна 2014 лекция 6Бизнес весна 2014 лекция 6
Бизнес весна 2014 лекция 6Technopark
 
Тестирование весна 2014 смешанное занятие 3
Тестирование весна 2014 смешанное занятие 3Тестирование весна 2014 смешанное занятие 3
Тестирование весна 2014 смешанное занятие 3Technopark
 
Бизнес весна 2014 лекция 4
Бизнес весна 2014 лекция 4Бизнес весна 2014 лекция 4
Бизнес весна 2014 лекция 4Technopark
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
Technopark
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
Technopark
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
Technopark
 

Viewers also liked (20)

Java осень 2012 лекция 4
Java осень 2012 лекция 4Java осень 2012 лекция 4
Java осень 2012 лекция 4
 
Бизнес весна 2014 лекция 3
Бизнес весна 2014 лекция 3Бизнес весна 2014 лекция 3
Бизнес весна 2014 лекция 3
 
Разработка веб-сервисов осень 2013 лекция 12
Разработка веб-сервисов осень 2013 лекция 12Разработка веб-сервисов осень 2013 лекция 12
Разработка веб-сервисов осень 2013 лекция 12
 
Java весна 2014 лекция 5
Java весна 2014 лекция 5Java весна 2014 лекция 5
Java весна 2014 лекция 5
 
Разработка веб-сервисов осень 2013 лекция 7
Разработка веб-сервисов осень 2013 лекция 7Разработка веб-сервисов осень 2013 лекция 7
Разработка веб-сервисов осень 2013 лекция 7
 
Бизнес весна 2014 лекция 2
Бизнес весна 2014 лекция 2Бизнес весна 2014 лекция 2
Бизнес весна 2014 лекция 2
 
C++ осень 2013 лекция 1
C++ осень 2013 лекция 1C++ осень 2013 лекция 1
C++ осень 2013 лекция 1
 
углубленное программирование на C++. лекция no.5 [4.0]
углубленное программирование на C++. лекция no.5 [4.0]углубленное программирование на C++. лекция no.5 [4.0]
углубленное программирование на C++. лекция no.5 [4.0]
 
C++ весна 2014 лекция 2
C++ весна 2014 лекция 2C++ весна 2014 лекция 2
C++ весна 2014 лекция 2
 
Web осень 2012 лекция 2
Web осень 2012 лекция 2Web осень 2012 лекция 2
Web осень 2012 лекция 2
 
Тестирование лекция 2 весна 2014
Тестирование лекция 2 весна 2014Тестирование лекция 2 весна 2014
Тестирование лекция 2 весна 2014
 
Алгоритмы и структуры данных весна 2014 лекция 3
Алгоритмы и структуры данных весна 2014 лекция 3Алгоритмы и структуры данных весна 2014 лекция 3
Алгоритмы и структуры данных весна 2014 лекция 3
 
HighLoad весна 2014 лекция 5
HighLoad весна 2014 лекция 5HighLoad весна 2014 лекция 5
HighLoad весна 2014 лекция 5
 
Проектирование интерфейсов весна 2014 занятие 7
Проектирование интерфейсов весна 2014 занятие 7Проектирование интерфейсов весна 2014 занятие 7
Проектирование интерфейсов весна 2014 занятие 7
 
Бизнес весна 2014 лекция 6
Бизнес весна 2014 лекция 6Бизнес весна 2014 лекция 6
Бизнес весна 2014 лекция 6
 
Тестирование весна 2014 смешанное занятие 3
Тестирование весна 2014 смешанное занятие 3Тестирование весна 2014 смешанное занятие 3
Тестирование весна 2014 смешанное занятие 3
 
Бизнес весна 2014 лекция 4
Бизнес весна 2014 лекция 4Бизнес весна 2014 лекция 4
Бизнес весна 2014 лекция 4
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
 

Similar to C++ осень 2012 лекция 3

C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9Technopark
 
C++ Базовый. Занятие 09.
C++ Базовый. Занятие 09.C++ Базовый. Занятие 09.
C++ Базовый. Занятие 09.
Igor Shkulipa
 
C++ осень 2013 лекция 3
C++ осень 2013 лекция 3C++ осень 2013 лекция 3
C++ осень 2013 лекция 3Technopark
 
Lecture5
Lecture5Lecture5
Lecture5orgil
 
C++ осень 2013 лекция 5
C++ осень 2013 лекция 5C++ осень 2013 лекция 5
C++ осень 2013 лекция 5Technopark
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4Technopark
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
Igor Shkulipa
 
Классы и объекты С#
Классы и объекты С#Классы и объекты С#
C++ осень 2012 лекция 6
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6Technopark
 
C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5Technopark
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6
Dima Dzuba
 
C++ осень 2013 лекция 9
C++ осень 2013 лекция 9C++ осень 2013 лекция 9
C++ осень 2013 лекция 9Technopark
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Javametaform
 
Msu.Center.Lectures.J05 Handling Exceptions
Msu.Center.Lectures.J05 Handling ExceptionsMsu.Center.Lectures.J05 Handling Exceptions
Msu.Center.Lectures.J05 Handling Exceptionsolegol
 
05 Обработка Исключений
05 Обработка Исключений05 Обработка Исключений
05 Обработка Исключенийphearnot
 
C++ осень 2013 лекция 7
C++ осень 2013 лекция 7C++ осень 2013 лекция 7
C++ осень 2013 лекция 7Technopark
 
Java. Lecture 05. Handling Exceptions and Debugging
Java. Lecture 05. Handling Exceptions and DebuggingJava. Lecture 05. Handling Exceptions and Debugging
Java. Lecture 05. Handling Exceptions and Debuggingcolriot
 
Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8.
Dima Dzuba
 
Android - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsAndroid - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsNoveo
 

Similar to C++ осень 2012 лекция 3 (20)

C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9
 
C++ Базовый. Занятие 09.
C++ Базовый. Занятие 09.C++ Базовый. Занятие 09.
C++ Базовый. Занятие 09.
 
C++ осень 2013 лекция 3
C++ осень 2013 лекция 3C++ осень 2013 лекция 3
C++ осень 2013 лекция 3
 
Lecture5
Lecture5Lecture5
Lecture5
 
C++ осень 2013 лекция 5
C++ осень 2013 лекция 5C++ осень 2013 лекция 5
C++ осень 2013 лекция 5
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
 
Классы и объекты С#
Классы и объекты С#Классы и объекты С#
Классы и объекты С#
 
C++ осень 2012 лекция 6
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6
 
C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6
 
C++ осень 2013 лекция 9
C++ осень 2013 лекция 9C++ осень 2013 лекция 9
C++ осень 2013 лекция 9
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
 
Msu.Center.Lectures.J05 Handling Exceptions
Msu.Center.Lectures.J05 Handling ExceptionsMsu.Center.Lectures.J05 Handling Exceptions
Msu.Center.Lectures.J05 Handling Exceptions
 
05 Обработка Исключений
05 Обработка Исключений05 Обработка Исключений
05 Обработка Исключений
 
C++ осень 2013 лекция 7
C++ осень 2013 лекция 7C++ осень 2013 лекция 7
C++ осень 2013 лекция 7
 
Java. Lecture 05. Handling Exceptions and Debugging
Java. Lecture 05. Handling Exceptions and DebuggingJava. Lecture 05. Handling Exceptions and Debugging
Java. Lecture 05. Handling Exceptions and Debugging
 
Bytecode
BytecodeBytecode
Bytecode
 
Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8.
 
Android - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsAndroid - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, generics
 

More from Technopark

Лекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelЛекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель Pregel
Technopark
 
Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuЛекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.Ru
Technopark
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARN
Technopark
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. Spark
Technopark
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache Mahout
Technopark
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeper
Technopark
 
Лекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveЛекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и Hive
Technopark
 
Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)
Technopark
 
Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)
Technopark
 
Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)
Technopark
 
Лекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSЛекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFS
Technopark
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы Hadoop
Technopark
 
Лекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceЛекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduce
Technopark
 
СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"
Technopark
 
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
Technopark
 
СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"
Technopark
 
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
Technopark
 
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
Technopark
 
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
Technopark
 
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
Technopark
 

More from Technopark (20)

Лекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelЛекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель Pregel
 
Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuЛекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.Ru
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARN
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. Spark
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache Mahout
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeper
 
Лекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveЛекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и Hive
 
Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)
 
Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)
 
Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)
 
Лекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSЛекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFS
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы Hadoop
 
Лекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceЛекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduce
 
СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"
 
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
 
СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"
 
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
 
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
 
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
 
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
 

C++ осень 2012 лекция 3

  • 2. Лекция №3. Шаблоны классов и методов. Обработка исключительных ситуаций. Обобщенное и безопасное программирование • Шаблоны классов и методов. • Обобщенное программирование. • Параметры шаблонов. • Специализация, конкретизация и перегрузка шаблонов. • Понятие, поддержка и технология обработки исключительных ситуаций. • Безопасное программирование. • Нейтральность кода. • Критерии безопасности и нейтральности классов и методов. • Безопасность конструкторов и деструкторов. • Исключения в стандартной библиотеке.
  • 3. Шаблоны классов (1 / 2) Шаблон класса — элемент языка, позволяющий параметризовать типы и значения, используемые для автоматического создания (конкретизации) классов по обобщенному описанию (шаблону). Использование шаблонов классов является первым шагом на пути к обобщенному программированию. Различают объявления и определения шаблонов классов. В отличие от «обычного» класса объявления и определения шаблона содержат списки параметров шаблона, среди которых выделяются параметры- типы и параметры-константы. Параметры-типы шаблона класса представляют некоторый тип данных, параметры-константы — некоторое константное (вычисляемое при компиляции) выражение.
  • 4. Шаблоны классов (2 / 2) Например: template <class T, class U, int size> // template <typename T, typename U, int size> class TestCase { public: TestCase() : _size(size) // … private: T _prm_1; U* _prm_2; int _size; };
  • 5. Параметры шаблонов классов Параметры шаблона класса не могут быть одноименными члену соответствующего шаблона. Имя параметра шаблона может присутствовать в списке параметров лишь один раз. Имена параметров в объявлении (если есть) и определении шаблона могут различаться. Параметры могут иметь значения по умолчанию. Константные выражения с одинаковыми значениями трактуются как эквивалентные параметры-константы шаблонов классов.
  • 6. Конкретизация шаблонов классов Конкретизация шаблона — это автоматическая генерация исходного кода конкретного класса в соответствии с заданным программистом определением шаблона класса. Конкретизированный шаблон может использоваться везде, где допустимо использование «обычного» класса (включая объявления и определения шаблонов функций), а экземпляры автоматически сгенерированного класса — везде, где допустимы «обычные» объекты. Шаблон класса конкретизируется тогда, когда впервые требуется определение автоматически генерируемого класса. Например: TestCase<int, double, 10> tc1;
  • 7. Методы шаблонов классов Методы шаблонов классов также являются шаблонами и конкретизируются в точке вызова или взятия адреса. При этом конкретизируемый метод относится к тому классу, через объект которого вызывается. Например: template <class T, class U, int size> TestCase<T, U, size>::~TestCase() { /* … */ }
  • 8. Дружественные объекты в шаблонах классов Дружественными по отношению к шаблонам классов могут быть: • «обычная» дружественная функция (не шаблон); • «обычный» дружественный класс (не шаблон); • связанный шаблон дружественной функции, взаимно однозначно соответствующий шаблону класса (с общим для обоих шаблонов списком параметров); • связанный шаблон дружественного класса, взаимно однозначно соответствующий шаблону класса (с общим для обоих шаблонов списком параметров); • несвязанный шаблон дружественной функции, соответствующий всем возможным конкретизациям шаблона класса (с раздельными списками параметров); • несвязанный шаблон дружественного класса, соответствующий всем возможным конкретизациям шаблона класса (с раздельными списками параметров).
  • 9. Статические члены шаблонов классов Шаблоны классов могут содержать статические члены данных, собственный набор которых имеет каждый конкретизированный согласно шаблону класс. Например: template <class T, class U, int size> class TestCase { /* … */ private: static TestCase *_head; }; template <class T, class U, int size> TestCase<T, U, size> *TestCase<T, U, size>::_head = NULL;
  • 10. Специализация шаблонов классов (1 / 3) Шаблоны классов в языке C++ допускают частичную (полную) специализацию, при которой отдельные (все) параметры шаблона заменены конкретными именами типов или значениями константных выражений. Например (специализация члена класса): template<> void TestCase<int, double, 10>::foo() { /* … */ }
  • 11. Специализация шаблонов классов (2 / 3) Например (полная специализация класса): template<> class TestCase<int, double, 100> { public: TestCase<int, double, 100>(); ~TestCase<int, double, 100>(); void foo(); /* … */ };
  • 12. Специализация шаблонов классов (3 / 3) Например (частичная специализация класса): template <class T, class U> class TestCase<T, U, 100> { public: TestCase(); ~TestCase (); /* … */ };
  • 13. Понятие исключительных ситуаций (1 / 2) Естественный порядок функционирование программ нарушают возникающие нештатные ситуации, в большинстве случаев связанные с ошибками времени выполнения (иногда — с необходимостью внезапно переключить контекст приложения). В языке C++ такие нештатные ситуации называются исключительными (иначе говоря — исключениями). Примерами исключительных ситуаций являются: • нехватка оперативной памяти; • попытка доступа к элементу коллекции по некорректному индексу; • попытка недопустимого преобразования динамических типов и пр.
  • 14. Понятие исключительных ситуаций (2 / 2) Архитектурной особенностью механизма обработки исключительных ситуаций в языке C++ является принципиальная независимость (несвязность) фрагментов программы, где исключение возбуждается и где оно обрабатывается. Обработка исключительных ситуаций носит невозвратный характер.
  • 15. Объекты-исключения. Оператор throw Носителями информации об аномальной ситуации (исключении) в C++ являются объекты заранее выбранных на эту роль типов (пользовательских или — Sic! — базовых, например, char*). Такие объекты называются объектами-исключениями. Жизненный цикл объектов-исключений начинается с возбуждения исключительной ситуации посредством оператора throw, например: throw "Illegal cast"; // char * /* … */ throw IllegalCast(); // class IllegalCast /* … */ enum EPrgStatus {psOK, psBadIndex, psIllegalCast}; throw psIllegalCast; // enum EPrgStatus
  • 16. Защищенные блоки. Операторы try, catch (1 / 2) Небезопасные с точки зрения исключений фрагменты кода должны инкапсулироваться в защищенный (контролируемый) блок, за которым следует один или несколько ассоциированных с ним блоков- обработчиков исключений. Защищенные блоки кода начинаются ключевым словом try, блоки- обработчики — словом catch. При возбуждении исключения в одном из операторов защищенного блока все следующие за ним операторы блока автоматически пропускаются, а управление передается ближайшему соответствующему блоку-обработчику исключения. Если такой блок не найден, управление берет на себя стандартная функция terminate(). Иначе обработку исключительной ситуации берет на себя первый подходящий для этого блок в порядке их указания в исходном коде.
  • 17. Защищенные блоки. Операторы try, catch (2 / 2) Например: void foo() { /* … */ throw "Illegal id"; /* … */ // не выполняется } void bar() { try { foo(); /* … */ // не выполняется } catch(char *s) { cout << s << endl; } }
  • 18. Функциональные защищенные блоки Как защищенный блок может быть оформлена не только часть функции, но и функция целиком (в том числе main() и конструкторы классов). В таком случае защищенный блок называют функциональным. Например: void foobar() try { /* … */ } catch( /* … */ ) { /* … */ } catch( /* … */ ) { /* … */ } catch( /* … */ ) { /* … */ }
  • 19. Варианты объявления исключений Объявление исключения в блоке-обработчике может быть объявлением типа, объекта, ссылки или указателя на объект. Например: catch(IllegalCast) { /* … */ } catch(IllegalCast ic) { /* … */ } catch(IllegalCast &ric) { /* … */ } catch(IllegalCast *pic) { /* … */ }
  • 20. Раскрутка стека и уничтожение объектов Поиск catch-блока, пригодного для обработки возбужденного исключения, приводит к раскрутке стека — последовательному выходу из составных операторов и определений функций. В ходе раскрутки стека происходит уничтожение локальных объектов, определенных в покидаемых областях видимости. При этом деструкторы локальных объектов вызываются штатным образом (строгая гарантия C++). Исключение, для обработки которого не найден catch-блок, инициирует запуск функции terminate(), передающей управление функции abort(), которая аварийно завершает программу.
  • 21. Повторное возбуждение исключения и универсальный блок-обработчик Оператор throw без параметров помещается (только) в catch-блок и повторно возбуждает обрабатываемое исключение. При этом его копия не создается: throw; Особая форма блока-обработчика исключений осуществляет перехват любых исключений: catch(...) { /* … */ };
  • 22. Безопасность ПО как показатель качества В «промышленном программировании» безопасность ПО рассматривается как один из структурных показателей качества продукта, оцениваемый путем статического анализа архитектуры, состава используемых компонентов, исходного кода и схемы БД. Примечание: См. модель SQuaRE, описанную в международных стандартах ISO/IEC 9126-3 “Software Engineering — Product Quality” и ISO 25000:2005 “Software Engineering — Software product Quality Requirements and Evaluation (SQuaRE) — Guide to SQuaRE”. Для обеспечения «структурной безопасности» исходного кода необходимо соблюдение стандартов разработки архитектуры и стандартов кодирования.
  • 23. Стандарты кодирования — за «безопасный код» Структурная безопасность исходного кода ПО требует соблюдения определенных техник кодирования, одной из которых является систематическая обработка ошибок и исключительных ситуаций на всех уровнях архитектуры (уровень представления, уровень бизнес- логики, уровень (базы) данных). Одним из элементов обработки ошибок и исключений является спецификация (ограничение) типов исключений, которые могут порождать структурные элементы кода.
  • 24. Безопасность классов и методов (1 / 2) Функция C++ безопасна, если не возбуждает никаких исключений (или, что то же самое, все возбужденные внутри нее исключения обрабатываются в ее теле). Класс C++ безопасен, если безопасны все его методы. В свою очередь, небезопасные функции могут специфицировать исключения, возбуждением которых (и только их!) способно завершиться исполнение таких функций. Обнаруженное при исполнении нарушение гарантии влечет за собой вызов функции unexpected(), по умолчанию вызывающей terminate(). Виртуальные функции в производных классах могут повторять спецификации исключений функций в базовых классов или накладывать более строгие ограничения.
  • 25. Безопасность классов и методов (2 / 2) Например: // объявления функций int foo(int &i) throw(); bool bar(char *pc = 0) throw(IllegalCast); void foobar() throw(IllegalCast, BadIndex); // определения функции int foo(int &i) throw() { /* … */ } bool bar(char *pc = 0) throw(IllegalCast) { /* … */ } void foobar() throw(IllegalCast, BadIndex) { /* … */ }
  • 26. Безопасность конструкторов Конструкторы могут возбуждать исключения, как и другие методы классов. Для обработки всех исключений, возникших при исполнении конструктора, его тело и список инициализации должны быть совместно помещены в функциональный защищенный блок. Например: Beta::Beta(int value) try : Alpha(foo(value)) { // тело конструктора /* … */ } catch(...) { /* … */ }
  • 27. Безопасность деструкторов Деструкторы классов не должны возбуждать исключения. Одной из причин этого является необходимость корректного освобождения ресурсов, занятых массивами и коллекциями объектов. Если вызываемая в деструкторе функция может возбудить исключение, деструктор должен перехватить и обработать его (возможно, прервав программу). Если возможность реакции на исключение необходима клиентам класса во время некоторой операции, в его открытом интерфейса должна быть функция (не деструктор), которая операцию выполняет. В общем случае деструктор класса может специфицироваться как throw(): ~Alpha() throw();
  • 28. Безопасность или нейтральность кода? От безопасности программного кода важно отличать нейтральность, под которой, согласно терминологии Г. Саттера (Herb Sutter), следует понимать способность методов класса прозрачно «пропускать сквозь себя» объекты-исключения, полученные ими на обработку, но не предназначенные для них. Нейтральный метод: • может обрабатывать исключения; • должен ретранслировать полученные им исключения методу- обработчику в неизменном виде и сохранять свою работоспособность при любых обстоятельствах.
  • 29. Пользовательские классы исключительных ситуаций Для передачи из точки возбуждения исключения в точку его обработки сведений об условиях возникновения аномалии программист может определять и использовать собственные классы исключительных ситуаций. Такие классы могут быть сколь угодно простыми (включая пустые) или сложными (содержащими члены данных, конструкторы, деструкторы и интерфейсные методы).
  • 30. Исключения в стандартной библиотеке. Класс exception Стандартная библиотека языка C++ содержит собственную иерархию классов исключений, являющихся прямыми или косвенными потомками базового класса exception. namespace std { class exception { public: exception() throw(); exception( const exception & ) throw(); exception& operator=( const exception & ) throw(); virtual ~exception() throw(); virtual const char* what() const throw(); }; } Потомки класса exception условно представляют две категории ошибок: логические ошибки и ошибки времени исполнения.
  • 31. Классы – логические ошибки (1 / 2) В число классов категории «логические ошибки» входят базовый промежуточный класс logic_error, а также производные от него специализированные классы: • invalid_argument — ошибка «неверный аргумент»; • out_of_range — ошибка «вне диапазона»; • length_error — ошибка «неверная длина»; • domain_error — ошибка «вне допустимой области».
  • 32. Классы – логические ошибки (2 / 2) logic_error invalid_argument out_of_range length_error domain_error
  • 33. Классы – ошибки времени исполнения (1 / 2) В число классов категории «ошибки времени исполнения» входят базовый промежуточный класс runtime_error, а также производные от него специализированные классы: • range_error — ошибка диапазона; • overflow_error — переполнение; • underflow_error — потеря значимости.
  • 34. Классы – ошибки времени исполнения (2 / 2) runtime_error range_error overflow_error underflow_error
  • 35. Прочие классы исключений стандартной библиотеки Также производными от exception являются классы bad_alloc и bad_cast, сигнализирующие об ошибках при выделении динамической памяти и неудаче при выполнении «ссылочного» варианта операции dynamic_cast, соответственно. exception bad_alloc bad_cast
  • 36. Классы исключений стандартной библиотеки: «вид сверху» exception invalid_argument out_of_range length_error domain_error range_error overflow_error underflow_error bad_alloc bad_cast logic_error runtime_error