异常类型和异常变量的生命周期

异常类型和异常变量的生命周期

throw的异常是有类型的,可以使,数字、字符串、类对象。

throw的异常是有类型的,catch严格按照类型进行匹配。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>


using namespace std;

class MyException {
public:

MyException(){}
//有参构造
MyException(const char * str){
mStr = new char[strlen(str) + 1];
strcpy(mStr,str);
}
//拷贝构造
MyException(const MyException & mE) {
this -> mStr = new char[strlen(mE.mStr) + 1];
strcpy(this->mStr,mE.mStr);
}
void what() {
cout << mStr << endl;
}

~MyException() {
if (mStr != NULL) {
delete[] mStr;
}
cout << "对象析构" << endl;
}
private:
char * mStr;

};

void test01() {
//创建一个匿名对象
throw MyException("未知异常");
}

int main(char *argv[], int argc)
{
try {
test01();
}
catch (MyException mE) {
mE.what();
}
return 0;
}


throw抛出去的如果是普通类型或者引用变量,它的生命周期是在catch结束后释放掉

如果throw抛出去的是一个指针,那么在进入catch前被释放掉

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>


using namespace std;

class MyException {
public:

MyException(){}
//有参构造
MyException(const char * str){
cout << "对象构造" << endl;
mStr = new char[strlen(str) + 1];
strcpy(mStr,str);
}
//拷贝构造
MyException(const MyException & mE) {
this -> mStr = new char[strlen(mE.mStr) + 1];
strcpy(this->mStr,mE.mStr);
}
void what() {
cout << mStr << endl;
}

~MyException() {
if (mStr != NULL) {
delete[] mStr;
}
cout << "对象析构" << endl;


}
private:
char * mStr;

};

void test01() {
//创建一个匿名对象,如果抛出的是指针,会在进入catch前就释放掉该指针
cout << "&(MyException(未知异常))" << endl;
throw &(MyException("未知异常"));
}
void test02() {
//创建一个匿名对象,抛出一个普通对象,用引用去接

cout << "MyException(未知异常)" << endl;
throw MyException("未知异常");
}

void test03() {

//创建一个匿名对象,抛出一个普通对象
cout << "MyException(未知异常) 用普通对象来接" << endl;
throw MyException("未知异常");
}

int main(char *argv[], int argc)
{
try {
test01();

}

catch (MyException * mE) {
cout << "未知异常" << endl;

}

cout << "=================================" << endl;

try {
test02();
}
catch (MyException & mE)
{
cout << "未知异常" << endl;

}

cout << "=================================" << endl;


try {
test03();
}
catch (MyException mE)
{
cout << "未知异常" << endl;

}
return 0;
}

1624150637188