Технология ООП
Санкт-Петербургский государственный политехнический университет
4 октября 2011
Технология ООП
Обработка исключительных ситуаций
При обработке рассматриваются только ситуации внутреннего
характера (нет памяти в области heap, не найден файл,
переполнение и т.д.). Ситуация созданная нажатием Ctrl-C
считается внешней.
Технология ООП
Обработка исключительных ситуаций
Синтаксис исключений:
try {
...
}
Обозначает контролируемый блок кода.
Технология ООП
Обработка исключительных ситуаций
Генерация исключений:
throw [ выражение ] ;
Технология ООП
Обработка исключительных ситуаций
Обработка исключений:
catch ( тип имя ) { /∗ тело обработчика ∗/ }
catch ( тип ) { /∗ тело обработчика ∗/ }
catch ( . . . ) { /∗ тело обработчика ∗/ }
Технология ООП
Обработка исключительных ситуаций
Обработка исключений:
catch ( i n t i ) { // i n t }
catch ( const char ∗ ) { // c o n s t c h a r ∗ }
catch ( O v e r f l o w ) { // к л а с с O v e r f l o w }
catch ( . . . ) { /∗ обработка в с е х исключений ∗/ }
Технология ООП
Обработка исключительных ситуаций
После обработки исключения управление передается первому
оператору находящемуся за блоком исключений. Туда же,
минуя код всех обработчиков, передается управление, если
исключение в try-блоке не было сгенерировано.
Технология ООП
Обработка исключительных ситуаций
При генерации исключения в C++ происходят следующие
действия:
создается копия параметра throw в виде объекта, который
существует до тех пор, пока исключение не будет
обработано;
вызываются деструкторы объектов выходящих из области
дейстия;
передается объект и управление обработчику имеющему
совместимый тип с этим объектом.
Технология ООП
Обработка исключительных ситуаций
При генерации исключений:
создается копия параметра throw в виде объекта, который
существует до тех пор, пока исключение не будет
обработано;
вызываются деструкторы объектов выходящих из области
дейстия;
передается объект и управление обработчику имеющему
совместимый тип с этим объектом.
Технология ООП
Обработка исключительных ситуаций
Обработчик считается найденым, если:
тип объекта в обработчеке тот же, что и указан после
throw, т.е. T, const T, T& или const T&, где T — тип
исключения;
является производным от указанного в параметре catch,
если наследования производилось с ключем public;
является указателем который может быть преобразован к
нужному типу, например void* .
Технология ООП
Обработка исключительных ситуаций
Если происходит вызов непредусмотренного исключения, то
вызывается функция unexpected(), реализацию которой можно
заменить при помощи set_unexpected(), если такой функции
нету, то вызывается функция terminate(), реализацию которой
можно заменить при помощи set_terminate(), если такой
функции нету то происходит вызов функции abort().
Технология ООП
Обработка исключительных ситуаций
Типы исключений которые может генерировать функция,
перечисляются после ключевого слова throw после прототипа
функции.
v o i d f 1 ( ) throw ( i n t , const char ∗ ) { /∗ может
генерировать только типов i n t или c h a r ∗ ∗/ }
v o i d f 2 ( ) throw ( Oops ∗ ) { /∗ исключения типа
у к а з а т е л ь на к л а с с ∗/ }
Технология ООП
Обработка исключительных ситуаций
v o i d f 1 ( ) throw ( )
{
// Тело функции , не порождающей исключений
}
Технология ООП
Обработка исключительных ситуаций
При переопределении виртуальной функции можно задавать
список исключений такой же или более ограниченный чем в
базовом классе.
Если функция вызывает не описанное исключение, выывается
функция unexpected().
Технология ООП
Исключения в конструкторах и деструкторах
class Vector {
public :
class Size {};
enum {max = 3 2 0 0 0 } ;
Vector ( int n)
{ i f ( n<0 | | n > max ) throw S i z e ( ) ; }
};
try {
V e c t o r ∗p = new V e c t o r ( i ) ;
...
}
catch ( V e c t o r : : S i z e ) { // Обработка ошибки размера
вектора }
Технология ООП
Исключения в конструкторах и деструкторах
Если в конструкторе генерируется исключение то
автоматически вызываются деструкторы для полностью
созданных в этом блоке объектов. Например, если исключение
было вызвано при создании массива объектов, то деструкторы
будут вызваны только для успешно созданных элементов. Если
память выделяется динамически с помощью операции new и в
конструкторе возникает исключение, память из-под объекта
корректно освобождается.
Технология ООП
Стандартные исключения
bad_alloc
bad_cast
bad_typeid
bad_exception
Технология ООП
Стандартная библиотека С++
Файловые потоки:
ifstream — входной файловый поток
ofstream — выходной файловый поток
fstream — двунаправленный
Технология ООП
Файловые потоки
char b u f [ 1 0 0 ] ;
i f s t r e a m f f f (" f i l e . txt" , i o s : : in | i o s : : nocreate ) ;
if (! f f f )
c o u t << " e r r " ;
while ( ! f f f . eof () )
f f f . g e t l i n e ( buf , 1 0 0 ) ;
Технология ООП
Стандартная библиотека С++
Строковые потоки:
istringstream — входные строковые потоки;
ostringstream — выходные строковые потоки;
stringstream — двунаправленные строковые потоки.
Технология ООП
Файловые потоки
#i n c l u d e <s s t r e a m >
o s t r i n g s t r e a m os ;
time_t t ;
t i m e (& t ) ;
o s << "␣time : ␣" << c t i m e (& t ) ;
Технология ООП
Потоки и типы определенные пользователем
f r i e n d o s t r e a m& o p e r a t o r << ( o s t r e a m& out , MyClass&
C)
{ r e t u r n o u t << "␣x␣=␣" << C . x << "␣y␣" << C . y ; }
f r i e n d i s t r e a m& o p e r a t o r >> ( i s t r e a m& i n , MyClass&
C)
{ c o u t << " Enter ␣x : ␣" ; i n >> C . x ;
c o u t << " Enter ␣y : ␣" ; i n >> C . y ;
return in ;
}
Технология ООП
std::string
Класс string входит в стандартную библиотеку C++.
s t r i n g s 1 ( "Text" ) ;
s t r i n g s2 ;
char ∗ s t r = "Txt" ;
s t r i n g s3 ( s t r ) ;
Технология ООП
std::string
Функции:
s . at (1) ;
s 1 . append ( s 2 ) ; // +
s 1 . append ( s2 , 3 , 5 ) ;
s1 . i n s e r t (1 , st r 2 , 3 , 5) ;
s1 . r e p l a c e (1 , 2 , s t r 2 , 5) ;
s 1 . swap ( s 2 ) ;
s 1 . c _ s t r ( ) ; // возвращает c o n s t c h a r ∗
s 1 . f i n d ( s 2 ) ; // возвращает позицию
s 1 . compare ( 1 , 2 , s2 , 1 , 2 ) ; // аналог s t r s t r
Технология ООП
Контейнерные классы
Последовательные контейнеры:
vector — структура, эффективно реализующая
произвольныей доступ к элементам, а также добавление в
конец и удаление из конца;
dequeue — структура, эффективно реализующая
произвольныей доступ к элементам, а также добавление в
оба конеца и удаление из обоих концов;
list — список, эффективно реализует вставку и удаление
элементов в произвольное место, но не имеет
произвольного доступа к своим элементам.
Технология ООП
std::vector
v e c t o r <i n t > v ;
v . push_back ( 5 ) ;
v . push_back ( 6 ) ;
v . push_back ( 7 ) ;
f o r ( v e c t o r <i n t > : : i t e r a t o r i = v . b e g i n ( ) ; i != v .
end ( ) ; i ++)
{ c o u t << ∗ i << "␣" ; }
Технология ООП
std::vector
Функции:
i n s e r t ( ) // в с т а в к а в произвольное место
e r a s e ( ) // удаление из произвольного места
at , [ ] // произвольный доступ к элементу
Технология ООП
std::vector
Ассоциативные контейнеры:
map — словарь
multimap — словарь с дубликатами
Технология ООП
std::map
map<i n t , i n t > maps ;
maps [ 1 0 0 ] = 1 ;
maps [ 2 0 0 ] = 3 ;
Технология ООП