Освой самостоятельно С++ за 21 день.
Шрифт:
9. Что означает оператор catch(...)?
Оператор catch(...) будет перехватывать все исключения любого типа.
10. Что такое точка останова?
Это позиция в коде, в которой отладчик остановит выполнение программы.
Упражнения
1. Запишите блок try и оператор catch для отслеживания и обработки простого исключения.
#include <iostream.h>
class OutOfMemory {};
int main
{
try
{
int *myInt = new int;
if (myInt == 0)
throw OutOfMemory;
}
catch (OutOfMemory)
{
cout << "Unable to allocate memory!\n";
}
return 0;
}
2. Добавьте
#include <iostream.h>
#include <stdio.h>
#include <string.h>
class OutOfMemory;
{
public:
OutOfMemory(char *):
char>> GetString { return itsString; }
private:
char>> itsString;
};
OutOfMemory::OutOfMemory(char * theType)
{
itsString = new char[80];
char warning[] = "Out Of Memory! Can't allocate room for: ";
strncpy(itsString, warning,60);
strncat(itsString,theType,19);
}
int main
{
try
{
int *myInt = new int;
if (myInt == 0)
throw OutOfMemory("int");
}
catch (OutOfMemory& t:heException)
{
cout << theException.GetString;
}
return 0;
}
3. Унаследуйте новое исключение от исключения, полученного в упражнении 2. Измените блок оператора catch таким образом, чтобы в нем происходила обработка как производного, так и базового исключений.
1: #include <iostream.h>
2:
3: // Абстрактный тип исключений
4: class Exception
5: {
6: public:
7: Exception{}
8: virtual ~Exceptiori{}
9: virtual void PrintError = 0;
10: };
11:
12: // Производный класс для обработки проблем памяти
13: // Обратите внимание: в этом классе не производится выделение памяти
14: class OutOfMemory : public Exception
15: {
16: public:
17: OutOfMemory{}
18: ~OutOfMemory{}
19: virtual void PrintError;
20: private:
21: };
22:
23: void OutOfMemory::PrintError
24: {
25: cout << "Нет памяти !!\n";
26: }
27:
28: // Производный класс для обработки ввода неверных чисел
29: class RangeError : public Exception
30: {
31: public:
32: RangeError(unsigned long number){badNumber = number:}
33: ~RangeError{}
34: virtual void PrintError;
35: virtual unsigned long GetNumber { return badNumber; }
36: virtual void SetNumber( unsigned long number) {badNumber = number;}
37: private:
38: unsigned long badNumber;
39: };
40:
41: void RangeError::PrintError
42: {
43: cout << "Number out of range. You used " << GetNumber << "N\n";
44: }
45:
46: void MyFunction; // прототип функции
47:
48: int main
49: {
50: try
51: {
52: MyFunction;
53: }
54: // Чтобы использовать только один оператор catch,
55: // примените для этого виртуальные функции
56: catch (Exceptions theException)
57: {
58: theException.PrintError;
59: }
60: return 0;
61: }
62:
63: void MyFunction
64: {
65: unsigned int *myInt = new unsigned int;
66: long testNumber;
67: if (myInt == 0)
68: throw 0ut0fMemory;
69: cout << "Enter an int: ";
70: cin >> testNumber;
71: // эту проверку лучше заменить серией
72: // проверок, чтобы выявить неверные данные, введенные пользователем
73: if (testNumber > 3768 || testNumber < 0)
74: throw RangeError(testNumber);
75:
76: *mylnt = testNumber;
77: cout << "Ok. myInt: " << *myInt;
78: delete myInt;
79: }
4. Измените код из упражнения 3, чтобы получить трехуровневый вызов функции.
1: #include <iostream.h>
2:
3: // Абстрактный тип исключений
4: class Exception
5: {
6: public:;
7: Exception{ }
8: virtual ~Exception{}
9: virtual void PrintError = 0;
10: };
11:
12: // Производный класс для обработки проблем памяти
13: // Обратите внимание: в этом классе не производится выделение памяти!
14: class OutOfMemory : public Exception
15: {
16: public: