Lect18
.pdfОператор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