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

Lect18

.pdf
Скачиваний:
6
Добавлен:
03.03.2016
Размер:
645.27 Кб
Скачать

Операторthrow

Операторthrow позволяет сгенерироватьисключение.

Синтаксис:

throw [выражение]

Выражениеможетбытьлюбоготипа (кромеvoid)

11

Операторthrow

Привыполненииданногооператора

создаетсяобъектисключительнойситуациина основеобъекта,выступающеговкачестве аргументаоператораthrow

Дальнейшеевыполнениепрограммы прерывается,происходитпоискподходящего обработчикавзащищенномблокахtry-catch

Еслиподходящийобработчикнайден,топроисходит раскруткастека(stack unwinding),прикоторой уничтожаютсявсеавтоматическиеобъекты,созданные междуначаломсоответствующегоблокаtry

Еслиобработчикненайден,происходитзавершение работыпрограммы

12

Операторthrow

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

throw ( [type-ID-list] )

Пример:

void f() throw(int, some_class_type) { int i;

//... сгенерировать исключение 'int' throw i;

//...

}

13

Операторthrow

int main() { try {

f();

}catch(int e) {

// ... обработать 'int' исключение ...

}catch(some_class_type e) {

//... обработать исключение типа

//'some_class_type' ...

}

//... возможно, обработать

//другие исключения ...

return 0;

}

14

Перехватлюбыхисключений

Дляперехваталюбыхисключений используетсяcatch(…)

Даннаясекциязахватитисключение любоготипа

Секциюcatch(…) следует располагатьпоследнейвсписке

15

Примерперехваталюбых исключений

void f() { throw 1;

}

int main() { try {

f();

}

catch(int e) {

cout << "Ага, попался, int !! "

"Так вот ты какой: " << e << endl; } catch(...) {

cout << "Упс... Заметаем следы…" << endl;

}

return 0;

}

16

Примерперехваталюбых

исключений№2

#include <iostream> using namespace std;

int _tmain(int argc, _TCHAR* argv[]) { double d = 1.0;

for (int i=0; i<4; i++) { try {

cout << endl<< "Entering the try-block..." <<endl; switch (i) {

сase 0:

 

 

throw

"Throwing an exception of char*";

 

case 1:

 

 

throw

5;

 

default:

 

 

throw

d;

 

}

 

 

cout<< "In the try-block after all exceptions...

" << endl;

}

17

 

Примерперехваталюбых исключений№2

catch(int l) {

cout << "Int thrown: " << l << endl;

}catch(char* str) {

cout << "String thrown: " << str << endl;

}catch (...) {

cout << "An unknown type thrown."

<<"Program will terminate." << endl;

cin.ignore() ; return -1;

}

cout<< "End of the loop."<< endl;

}

cout << "The End." << endl; return 0;

}

18

Примерперехваталюбых

исключений№2

Результаты:

Entering the try-block...

String thrown: Throwing an exception of char*

End of the loop.

Entering the try-block...

Int thrown: 5

End of the loop.

Entering the try-block...

An unknown type thrown.Program will terminate

19

Приводимыетипы

Некоторыетипысточкизрения блоковобработкиисключений являютсяэквивалентными

Кэквивалентнымтипамотносятся

ТипыT,const T,T&,const T&

БазовыйклассT

Приводимыйуказатель,еслиT– указатель.

20

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]